Wenn es um die Optimierung von Python-Code (oder eines beliebigen Codes) geht, kommt es häufig zu Profiling, um Engpässe oder langsame Funktionen zu optimieren. Aber gibt es bei der Optimierung dieser Codebereiche irgendwelche Anwendungsfälle für die Verwendung von reinem Python bytecodeinline? Ich weiß, dass Sie dies durch die Verwendung der eingebauten Funktion compile
und compiler
Modul können.Python-Optimierung durch Bytecode
Antwort
... gibt es irgendwelche Anwendungsfälle für die Verwendung von reinem Python bytecode inline?
Ja. Manchmal können Sie einen etwas schnelleren Code ausführen, als Python normalerweise selbst generiert.
Sie können auch Zugriff auf die Schleifeninduktionsvariablen für Listenerfassungen erhalten.
Hier sind einige Links, die Sie zu erhalten begonnen: https://www.google.com/search?q=python+bytecode+hacks
Wenn Sie programmatisch die Bytecode-Manipulationen machen möchte, ist hier ein Optimierungs Rezept, das zeigt, wie man das macht: Decorator for BindingConstants at compile time
Das heißt, Wenn Sie sich für Geschwindigkeit interessieren, ist die einfachste Beschleunigung oft pypy anstelle von cpython, wenn Ihre Anwendung es erlaubt.
Nein. Der Quellcode wird nur einmal in Bytecode kompiliert, wenn das Modul zum ersten Mal geladen wird. Der Bytecode wird zur Laufzeit interpretiert. Selbst wenn Sie Bytecode in Ihre Quelle einfügen könnten, würde dies höchstens die Startzeit des Programms beeinflussen, da Python weniger Zeit benötigt, um den Quellcode in Bytecode umzuwandeln. Es würde nicht wirklich ändern, wie schnell dieser Code läuft. Zum Beispiel würde eine "reine Bytecode" -Version einer Schleife, die 1000 Mal ausgeführt wird, nicht schneller als die gleiche Schleife ausgeführt werden, die im Python-Quellcode geschrieben wurde. Siehe this similar question und auch this one.
compile
und compiler
existieren, damit Sie dynamisch neuen ausführbaren Quellcode aus Zeichenfolgen erstellen können, während das Programm ausgeführt wird. Dies ist nicht für einen Leistungsvorteil, es ist nur weil es keinen anderen Weg gibt, es zu tun. Wenn Sie ein Python-Programm ausführen, kompiliert Python seinen Quellcode in Bytecode. Wenn Sie jedoch dynamisch neue Funktionen erstellen möchten, die nicht direkt im Quellcode vorhanden sind (z. B. durch Mischen und Abgleichen von Codefragmenten oder durch Eingabe von Code während des Programmablaufs), müssen Sie sie kompilieren im laufenden Betrieb, und das ist, was compile
ist. (Dies ist eigentlich keine allgemeine Notwendigkeit, so dass diese Funktionen nicht so häufig verwendet werden.)
Sie werden nicht den * gleichen * Bytecode schreiben, den Python hätte, genauso wie Sie Inline-Assembler nicht verwenden würden, um den gleichen Maschinencode zu schreiben, den Ihr C-Compiler würde. Der Punkt ist, einen besseren Bytecode zu schreiben. – user2357112
@ user2357112: Obwohl die folgende Antwort darauf hindeutet, dass dies theoretisch möglich ist, ist es nicht möglich, 'compile' zu verwenden, da' compile' nur Python-Quellcode aus einer Zeichenkette kompiliert. Wenn Sie einen besseren Bytecode erhalten könnten, indem Sie eine Zeichenfolge an 'compile' übergeben, könnten Sie denselben Bytecode erhalten, indem Sie diesen Quellcode direkt in Ihr Programm schreiben. – BrenBarn
Richtig, aber er erwähnt auch das Compiler-Modul, das für die Konstruktion von Code-Objekten verwendet werden kann, die komplizierter sind als "kompilieren" normalerweise. Natürlich wäre es einfacher, 'types.CodeType'-Objekte direkt zu erstellen, wenn Sie Python-Bytecode von Hand schreiben möchten. Der Python vm ist ein ziemlich ordentliches Stapel-orientiertes Biest. – Perkins