120 votes

while (1) vs pour while--pourquoi y a-t-il une différence ?

Intrigué par cette question sur les boucles infinies en perl: http://stackoverflow.com/questions/885908/while-1-vs-for-is-there-a-speed-difference, j'ai décidé de lancer une comparaison similaire en python. J'ai attendu que le compilateur générera le même octets de code pour while(True): pass et while(1): pass, mais ce n'est pas vraiment le cas dans python2.7.

Le script suivant:

import dis

def while_one():
    while 1:
        pass

def while_true():
    while True:
        pass

print("while 1")
print("----------------------------")
dis.dis(while_one)

print("while True")
print("----------------------------")
dis.dis(while_true)

donne les résultats suivants:

while 1
----------------------------
  4           0 SETUP_LOOP               3 (to 6)

  5     >>    3 JUMP_ABSOLUTE            3
        >>    6 LOAD_CONST               0 (None)
              9 RETURN_VALUE        
while True
----------------------------
  8           0 SETUP_LOOP              12 (to 15)
        >>    3 LOAD_GLOBAL              0 (True)
              6 JUMP_IF_FALSE            4 (to 13)
              9 POP_TOP             

  9          10 JUMP_ABSOLUTE            3
        >>   13 POP_TOP             
             14 POP_BLOCK           
        >>   15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        

À l'aide de while True est nettement plus compliqué. Pourquoi est-ce?

Dans d'autres contextes, python agit comme s' True est égal à 1:

>>> True == 1
True

>>> True + True
2

Pourquoi est - while distinguer les deux?

J'ai remarqué que python3 évalue les déclarations en utilisant les mêmes opérations:

while 1
----------------------------
  4           0 SETUP_LOOP               3 (to 6) 

  5     >>    3 JUMP_ABSOLUTE            3 
        >>    6 LOAD_CONST               0 (None) 
              9 RETURN_VALUE         
while True
----------------------------
  8           0 SETUP_LOOP               3 (to 6) 

  9     >>    3 JUMP_ABSOLUTE            3 
        >>    6 LOAD_CONST               0 (None) 
              9 RETURN_VALUE         

Est-il un changement dans python3 à la façon dont les booléens sont-ils évalués?

132voto

KennyTM Points 232647

En Python 2.x, True n'est pas un mot clé, mais juste un construit-dans la constante globale qui est définie à 1 dans l' bool type. Par conséquent, l'interprète a encore de charger le contenu de True. En d'autres termes, True est reassignable:

Python 2.7 (r27:82508, Jul  3 2010, 21:12:11) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
>>> True
4

En Python 3.x, il devient vraiment un mot-clé et un réel constant:

Python 3.1.2 (r312:79147, Jul 19 2010, 21:03:37) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> True = 4
  File "<stdin>", line 1
SyntaxError: assignment to keyword

ainsi, l'interprète peut remplacer l' while True: boucle avec une boucle infinie.

19voto

Aaron Hall Points 7381

Grande explication de KennyTM.

Pour une démonstration rapide sur le diff dans le temps, voici quelques fonctions :

Et voici l’affect sur le calendrier :

Si le temps est essentiel pour une boucle de longue durée en Python 2, vous devriez probablement utiliser au lieu de .

Mais sinon, opter pour la lisibilité du `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X