W następującym kodzie, dlaczego Python nie kompiluje f2
tego samego kodu bajtowego co f1
?Dlaczego Python nie ocenia arytmetyki liczb stałych przed kompilacją do kodu bajtowego?
Czy jest jakiś powód, aby tego nie robić?
>>> def f1(x):
x*100
>>> dis.dis(f1)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (100)
6 BINARY_MULTIPLY
7 POP_TOP
8 LOAD_CONST 0 (None)
11 RETURN_VALUE
>>> def f2(x):
x*10*10
>>> dis.dis(f2)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (10)
6 BINARY_MULTIPLY
7 LOAD_CONST 1 (10)
10 BINARY_MULTIPLY
11 POP_TOP
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Należy zauważyć, że nawet nic nie jest przekazywane do metody, wynik "dis" jest wciąż taki sam, tzn. Jeśli zawartość metody jest: 'x = 9; y = x * 10 * 10; ', wynik jest wciąż tym samym mianem. ładowanie const dwa razy. Wydaje się, że Python nie wykonuje optymalizacji całej metody? –
@ SanjayT.Sharma: Kompilator wciąż nie wie, czym jest "x", więc musi go bezpiecznie odtworzyć. Wszechstronne funkcje introspekcji i dynamicznego modyfikowania środowiska wykonawczego umożliwiają zmianę typu 'x' w locale funkcji. –
'x * (10 * 10)' powinno również działać, i jest nieco bardziej wyraźne. – WolframH