Non, ce n'est pas le cas .
La compilation en code octet CPython est uniquement transmise à travers un petit optimiseur de judas conçu pour ne faire que des optimisations de base (voir test_peepholer.py dans la suite de tests pour plus d'informations sur ces optimisations).
Pour voir ce qui va réellement se passer, utilisez dis
* pour voir les instructions générées. Pour la première fonction, contenant l'affectation:
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
Alors que, pour la deuxième fonction:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Deux autres instructions (rapides) sont utilisées dans la première: STORE_FAST
et LOAD_FAST
. Celles-ci effectuent un stockage et une saisie rapides de la valeur dans le fastlocals
tableau de la trame d'exécution actuelle. Ensuite, dans les deux cas, un RETURN_VALUE
est effectué. Ainsi, la seconde est un peu plus rapide en raison de moins de commandes nécessaires à l'exécution.
En général, sachez que le compilateur CPython est prudent dans les optimisations qu'il effectue. Il n'est pas et n'essaye pas d'être aussi intelligent que les autres compilateurs (qui, en général, ont également beaucoup plus d'informations sur lesquelles travailler). L'objectif principal de la conception, en plus d'être évidemment correct, est de a) rester simple et b) être aussi rapide que possible dans la compilation de ces derniers afin que vous ne remarquiez même pas qu'une phase de compilation existe.
En fin de compte, vous ne devriez pas vous soucier de petits problèmes comme celui-ci. L'avantage en vitesse est minime, constant et, éclipsé par la surcharge introduite par le fait que Python est interprété.
* dis
est un petit module Python qui désassemble votre code, vous pouvez l'utiliser pour voir le bytecode Python que la VM exécutera.
Remarque: comme indiqué également dans un commentaire de @Jorn Vernee, ceci est spécifique à l'implémentation CPython de Python. D'autres implémentations pourraient faire des optimisations plus agressives si elles le souhaitent, CPython ne le fait pas.
dis.dis(..)
les deux, vous voyez qu'il y a une différence , donc oui. Mais dans la plupart des applications du monde réel , la surcharge de ceci par rapport au retard du traitement dans la fonction n'est pas si grande.