Nein, das tut es nicht .
Die Kompilierung in CPython-Bytecode wird nur über einen kleinen Gucklochoptimierer geleitet , der nur für grundlegende Optimierungen ausgelegt ist (siehe test_peepholer.py) zu diesen Optimierungen finden in der Testsuite unter ).
Verwenden Sie dis
*, um die generierten Anweisungen anzuzeigen, um zu sehen, was tatsächlich passieren wird. Für die erste Funktion, die die Zuordnung enthält:
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
Während für die zweite Funktion:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
Im ersten werden zwei weitere (schnelle) Anweisungen verwendet: STORE_FAST
und LOAD_FAST
. Diese ermöglichen ein schnelles Speichern und Abrufen des Werts im fastlocals
Array des aktuellen Ausführungsrahmens. Dann wird in beiden Fällen a RETURN_VALUE
durchgeführt. Der zweite ist also ganz leicht schneller, da weniger Befehle zur Ausführung benötigt werden.
Beachten Sie im Allgemeinen, dass der CPython-Compiler bei den durchgeführten Optimierungen konservativ ist . Es ist nicht und versucht nicht, so intelligent zu sein wie andere Compiler (die im Allgemeinen auch viel mehr Informationen zum Arbeiten haben). Abgesehen von der offensichtlichen Richtigkeit besteht das Hauptziel des Designs darin, a) es einfach zu halten und b) diese so schnell wie möglich zu kompilieren, damit Sie nicht einmal bemerken, dass eine Kompilierungsphase existiert.
Am Ende sollten Sie sich nicht mit kleinen Problemen wie diesem beschäftigen. Der Geschwindigkeitsvorteil ist winzig, konstant und wird durch den Overhead, der durch die Interpretation von Python entsteht, in den Schatten gestellt.
* dis
ist ein kleines Python-Modul, das Ihren Code zerlegt. Sie können es verwenden, um den Python-Bytecode anzuzeigen, den die VM ausführen wird.
Hinweis: Wie auch in einem Kommentar von @Jorn Vernee angegeben, ist dies spezifisch für die CPython-Implementierung von Python. Andere Implementierungen führen möglicherweise aggressivere Optimierungen durch, wenn sie dies wünschen, CPython jedoch nicht.
dis.dis(..)
auf beiden verwenden, sehen Sie, dass es einen Unterschied gibt , also ja. In den meisten realen Anwendungen ist der Aufwand im Vergleich zur Verzögerung der Verarbeitung in der Funktion jedoch nicht so groß.