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.
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.
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.
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)
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.
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 |
Quand je l'ai exécuté avec python3, il était dans la plage d'erreur. Merci @shiracums de l'avoir signalé.