[PYTHON] le type de booléen pypy est lent

Réparer

Initialement, il a été publié sous le titre "python bool type is slow", mais le contenu de l'article ne s'applique que lors de l'utilisation de pypy, ce qui était une erreur. Je suis désolé de vous avoir donné la mauvaise information.

Ce que je veux dire

Lors de l'utilisation de pypy dans la programmation de compétition, il est lent à gérer True / False en tant que type booléen. Utilisons le type int.

Aperçu

Je pense qu'il est courant d'avoir une sorte de drapeau et de dériver le processus en conséquence.

f = 1

Quelques personnes

f = True

Je suis sûr qu'il y a des gens qui disent cela, mais je m'attends à ce que la même chose se produise dans les deux cas.

Cependant, en réalité, il existe une différence de vitesse d'exécution.

Pour être précis, il n'y a pas de différence dans le jugement de la valeur de vérité, et il y a une différence dans la réécriture. J'en parlerai plus tard.

Expérience

Comparons avec le code suivant. L'environnement d'exécution est PyPy3 (3.7.0) dans le test de code d'atcoder.

int.py


f = 1
for i in range(10**9):
    if f:
        f = 0
    else:
        f = 1

bool.py


f = True
for i in range(10**9):
    if f:
        f = False
    else:
        f = True

Le résultat ressemble à ceci. (Même si vous le faites plusieurs fois, cela ressemble à ceci)

code Temps d'exécution Mémoire
int.py 2423 ms 25640 KB
bool.py 7439 ms 25612 KB

La différence n'est-elle pas plus grande que ce à quoi je m'attendais? ?? Cela seul augmente le risque de TLE si la vitesse d'exécution est un problème grave. (En fait, j'étais accro à ABC182 E)

Considération

Donc, c'est juste un cas d'utilisation de pypy dans la programmation de compétition, mais si vous voulez utiliser des indicateurs, utilisez le type int au lieu du type bool.

J'ai essayé diverses expériences, mais il me semblait que ce n'était pas le jugement de vérité mais la réécriture de la valeur qui affectait la différence de vitesse.

Veuillez noter que la réécriture est une condition préalable à son utilisation comme indicateur. Par exemple, si vous placez un drapeau au milieu et que vous le maintenez après cela, il ne devrait y avoir aucune différence de vitesse. Si vous le tenez debout ou le pliez, vous pouvez TLE pour une raison aussi triviale.

Sauf si vous êtes particulier à ce sujet, nous vous recommandons d'utiliser le type int.

prime

J'ai aussi essayé str.

str.py


a = "True"
for i in range(10**9):
  if a == "True":
    a = "False"
  else:
    a = "True"

Les résultats sont les suivants. C'est le plus lent, non?

Temps d'exécution Mémoire
8183 ms 25612 KB

Postscript

Quand je l'ai exécuté avec python3, il était dans la plage d'erreur. Merci @shiracums de l'avoir signalé.

Recommended Posts

le type de booléen pypy est lent
pandas idxmax est lent
PyTorch DataLoader est lent
Le verrouillage de Pipenv est trop lent
La valeur de retour de l'opération booléenne Python n'est pas toujours de type booléen
Quel est le meilleur, PyPy ou Python?