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?