Nel codice seguente, perché Python non compila f2
allo stesso bytecode come f1
?Perché Python non valuta l'aritmetica numerica costante prima di compilarla in bytecode?
C'è un motivo per non farlo?
>>> 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
noti che anche è nulla viene passato al metodo, il risultato di 'dis' è sempre lo stesso cioè se il contenuto del metodo sono:' x = 9; y = x * 10 * 10; ', il risultato è sempre lo stesso vale. caricamento const due volte. Sembra che Python non esegua l'ottimizzazione dell'intero metodo? –
@ SanjayT.Sharma: il compilatore non può ancora sapere cosa sia 'x', quindi deve essere sicuro. L'introspezione versatile di Python e le funzionalità di modifica dinamica del runtime consentono di modificare il tipo di 'x' all'interno della funzione locale. –
'x * (10 * 10)' dovrebbe funzionare anche, ed è un po 'più esplicito. – WolframH