En el siguiente código, ¿por qué Python compila f2
en el mismo bytecode que f1
?¿Por qué Python no evalúa la aritmética de números constantes antes de compilar en bytecode?
¿Hay algún motivo para no hacerlo?
>>> 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
Tenga en cuenta que incluso si no se pasa nada al método, el resultado de 'dis' sigue siendo el mismo, es decir, si el contenido del método es:' x = 9; y = x * 10 * 10; ', el resultado sigue siendo el mismo. cargando const dos veces. Parece que Python no hace la optimización de todo el método? –
@ SanjayT.Sharma: el compilador todavía no puede saber realmente qué es 'x', por lo tanto, tiene que ir a lo seguro. Las versátiles funciones de introspección y modificación dinámica del tiempo de ejecución de Python hacen posible cambiar el tipo de 'x' dentro de los locales de la función. –
'x * (10 * 10)' debería funcionar también, y es un poco más explícito. – WolframH