Fasziniert von dieser Frage nach Endlosschleifen in Perl: while (1) Vs. für (;;) Gibt es einen Geschwindigkeitsunterschied? Ich habe beschlossen, einen ähnlichen Vergleich in Python durchzuführen. Ich habe erwartet, dass der Compiler den gleichen Bytecode für while(True): passund generiert while(1): pass, aber dies ist in Python2.7 eigentlich nicht der Fall.
Das folgende Skript:
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)
führt zu folgenden Ergebnissen:
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
Die Verwendung while Trueist spürbar komplizierter. Warum ist das?
In anderen Kontexten verhält sich Python so, als wäre es Truegleich 1:
>>> True == 1
True
>>> True + True
2
Warum whileunterscheidet man die beiden?
Mir ist aufgefallen, dass python3 die Anweisungen mit identischen Operationen auswertet:
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
Gibt es in Python3 eine Änderung in der Art und Weise, wie Boolesche Werte ausgewertet werden?