No, no es así .
La compilación al código de bytes CPython solo se pasa a través de un pequeño optimizador de mirilla que está diseñado para realizar solo optimizaciones básicas (consulte test_peepholer.py en el conjunto de pruebas para obtener más información sobre estas optimizaciones).
Para ver lo que realmente va a suceder, use dis
* para ver las instrucciones generadas. Para la primera función, que contiene la asignación:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
Mientras que, para la segunda función:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Se utilizan dos instrucciones más (rápidas) en la primera: STORE_FAST
y LOAD_FAST
. Estos hacen un almacenamiento rápido y capturan el valor en la fastlocals
matriz del marco de ejecución actual. Luego, en ambos casos, RETURN_VALUE
se realiza a. Entonces, el segundo es ligeramente más rápido debido a que se necesitan menos comandos para ejecutar.
En general, tenga en cuenta que el compilador CPython es conservador en las optimizaciones que realiza. No es ni intenta ser tan inteligente como otros compiladores (que, en general, también tienen mucha más información con la que trabajar). El objetivo principal del diseño, además de ser obviamente correcto, es a) mantenerlo simple yb) ser lo más rápido posible al compilarlos para que ni siquiera se dé cuenta de que existe una fase de compilación.
Al final, no deberías preocuparte por pequeños problemas como este. El beneficio de la velocidad es pequeño, constante y empequeñecido por la sobrecarga introducida por el hecho de que se interpreta Python.
* dis
es un pequeño módulo de Python que desensambla su código, puede usarlo para ver el código de bytes de Python que ejecutará la VM.
Nota: Como también se indicó en un comentario de @Jorn Vernee, esto es específico de la implementación CPython de Python. Otras implementaciones pueden hacer optimizaciones más agresivas si así lo desean, CPython no lo hace.
dis.dis(..)
en ambos ves que hay una diferencia , así que sí. Pero en la mayoría de las aplicaciones del mundo real , la sobrecarga de esto comparada con el retraso del procesamiento en la función no es tanto.