Gibt es einen endgültigen Unterschied zwischen den folgenden beiden Codefragmenten? Der erste weist einer Variablen in einer Funktion einen Wert zu und gibt diese Variable dann zurück. Die zweite Funktion gibt nur den Wert direkt zurück.
Verwandelt Python sie in äquivalenten Bytecode? Ist einer von ihnen schneller?
Fall 1 :
def func():
a = 42
return a
Fall 2 :
def func():
return 42
python
interpreter
python-internals
Jayesh
quelle
quelle
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ß.Antworten:
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:Während für die zweite Funktion:
Im ersten werden zwei weitere (schnelle) Anweisungen verwendet:
STORE_FAST
undLOAD_FAST
. Diese ermöglichen ein schnelles Speichern und Abrufen des Werts imfastlocals
Array des aktuellen Ausführungsrahmens. Dann wird in beiden Fällen aRETURN_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.
quelle
Beide sind grundsätzlich gleich, außer dass das Objekt im ersten Fall
42
einfach einer Variablen mit dem Namen zugewiesen wirda
oder mit anderen Worten, Namen (dha
) sich auf Werte (dh42
) beziehen . Es führt technisch keine Zuordnung in dem Sinne durch, dass es niemals Daten kopiert.Währenddessen
return
wird diese benannte Bindunga
im ersten Fall zurückgegeben, während das Objekt42
im zweiten Fall zurückgegeben wird.Weitere Informationen finden Sie in diesem großartigen Artikel von Ned Batchelder
quelle