it-swarm.com.de

Warum sollte man Python code kompilieren?

Warum würden Sie ein Python Skript kompilieren? Sie können sie direkt aus der .py-Datei ausführen und es funktioniert einwandfrei, gibt es also einen Leistungsvorteil oder so?

Ich bemerke auch, dass einige Dateien in meiner Anwendung in .pyc kompiliert werden, während andere dies nicht tun. Warum ist das so?

228
ryeguy

Es ist zu Bytecode kompiliert, der viel, viel, viel schneller verwendet werden kann.

Der Grund, warum einige Dateien nicht kompiliert werden, ist, dass das Hauptskript, das Sie mit python main.py Aufrufen, jedes Mal neu kompiliert wird, wenn Sie das Skript ausführen. Alle importierten Skripte werden kompiliert und auf der Festplatte gespeichert.

Wichtiger Zusatz von Ben Blank :

Es ist erwähnenswert, dass das Ausführen eines kompilierten Skripts eine schnellere Startzeit hat (da es nicht kompiliert werden muss), aber keine Startzeit hat schneller.

253
Georg Schölly

Die .pyc-Datei ist Python, das bereits zu Bytecode kompiliert wurde. Python führt automatisch eine .pyc-Datei aus, wenn es eine mit demselben Namen wie findet Eine von Ihnen aufgerufene .py-Datei.

"Eine Einführung in Python" sagt dies über kompilierte Python Dateien:

Ein Programm wird nicht schneller ausgeführt, wenn es aus einer ".pyc" - oder ".pyo" -Datei gelesen wird, als wenn es aus einer ".py" -Datei gelesen wird. Das einzige, was bei ".pyc" - oder ".pyo" -Dateien schneller ist, ist die Geschwindigkeit, mit der sie geladen werden.

Der Vorteil der Ausführung einer .pyc-Datei besteht darin, dass Python vor der Ausführung nicht kompiliert werden muss. Da Python zu Byte kompiliert würde -code, bevor eine .py-Datei ausgeführt wird. Abgesehen davon sollte es keine Leistungsverbesserung geben.

Wie viel Verbesserung können Sie durch die Verwendung kompilierter .pyc-Dateien erzielen? Das hängt davon ab, was das Skript macht. Bei einem sehr kurzen Skript, das einfach "Hello World" ausgibt, kann das Kompilieren einen großen Prozentsatz der gesamten Start- und Laufzeit ausmachen. Die Kosten für das Kompilieren eines Skripts im Verhältnis zur Gesamtlaufzeit verringern sich jedoch für länger laufende Skripts.

Das in der Befehlszeile angegebene Skript wird niemals in einer .pyc-Datei gespeichert. Nur Module, die von diesem "Hauptskript" geladen wurden, werden auf diese Weise gespeichert.

77
Bill Karwin

Pluspunkte:

Erstens: milde, unwiederbringliche Verschleierung.

Zweitens: Wenn die Kompilierung zu einer erheblich kleineren Datei führt, erhalten Sie schnellere Ladezeiten. Schön für das Web.

Drittens: Python kann den Kompilierungsschritt überspringen. Schneller beim ersten Laden. Gut für die CPU und das Web.

Viertens: Je mehr Sie kommentieren, desto kleiner ist die Datei .pyc Oder .pyo Im Vergleich zur Quelldatei .py.

Fünftens: Ein Endbenutzer, der nur eine .pyc - oder .pyo - Datei in der Hand hat, weist mit sehr viel geringerer Wahrscheinlichkeit auf einen Fehler hin, den er durch eine nicht rückgängig gemachte Änderung verursacht hat, über die er vergessen hat, Sie zu informieren.

Sechstens: Wenn Sie auf ein eingebettetes System abzielen, kann das Abrufen einer einzubettenden Datei von geringerer Größe ein erhebliches Plus bedeuten, und die Architektur ist stabil, so dass der unten beschriebene Nachteil nicht zum Tragen kommt.

Top Level Compilation

Es ist nützlich zu wissen, dass Sie eine Quelldatei der obersten Ebene python= in eine .pyc - Datei auf folgende Weise kompilieren können:

python -m py_compile myscript.py

Dadurch werden Kommentare entfernt. Es lässt docstrings intakt. Wenn Sie das docstrings auch loswerden möchten (Sie möchten vielleicht ernsthaft darüber nachdenken, warum Sie das tun), kompilieren Sie stattdessen auf diese Weise ...

python -OO -m py_compile myscript.py

... und Sie erhalten eine .pyo - Datei anstelle einer .pyc - Datei. In Bezug auf die wesentliche Funktionalität des Codes gleichermaßen verteilbar, jedoch um die Größe des ausgeblendeten docstrings kleiner (und für eine spätere Beschäftigung weniger leicht zu verstehen, wenn es überhaupt einen anständigen docstrings hätte). Aber siehe Nachteil drei unten.

Beachten Sie, dass python das Datum der .py - Datei verwendet, falls vorhanden, um zu entscheiden, ob die .py - Datei im Gegensatz zur .pyc oder .pyo - Bearbeiten Sie also Ihre .py-Datei, und die Datei .pyc oder .pyo ist veraltet, und alle erzielten Vorteile gehen verloren. Sie müssen sie neu kompilieren um die Vorteile .pyc oder .pyo wieder zurückzugewinnen, so wie sie sein mögen.

Nachteile:

Erstens: In den Dateien .pyc Und .pyo Befindet sich ein "Magic Cookie", das die Systemarchitektur angibt, in der die Datei python=) kompiliert wurde Diese Dateien werden in einer Umgebung eines anderen Typs beschädigt. Wenn Sie den .pyc oder .pyo ohne den zugeordneten .py neu kompilieren oder touch so verteilen es ersetzt den .pyc oder .pyo, der Endbenutzer kann es auch nicht reparieren.

Zweitens: Wenn docstrings mit der oben beschriebenen Befehlszeilenoption -OO Übersprungen wird, kann niemand auf diese Informationen zugreifen, was die Verwendung des Codes erschwert ( oder unmöglich.)

Drittens: Pythons Option -OO Implementiert auch einige Optimierungen gemäß der Befehlszeilenoption -O. Dies kann zu Betriebsänderungen führen. Bekannte Optimierungen sind:

  • sys.flags.optimize = 1
  • assert Anweisungen werden übersprungen
  • __debug__ = Falsch

Viertens: Wenn Sie absichtlich Ihr python= Skript mit etwas in der Reihenfolge #!/usr/bin/python In der ersten Zeile ausführbar gemacht haben, wird dies in .pyc Und .pyo Dateien und diese Funktionalität geht verloren.

Fünftens: Etwas offensichtlich, aber wenn Sie Ihren Code kompilieren, kann dies nicht nur die Verwendung des Codes beeinträchtigen, sondern auch das Potenzial für andere, von Ihrer Arbeit zu lernen, wird häufig erheblich verringert.

48
fyngyrz

Es gibt eine Leistungssteigerung beim Ausführen von kompiliertem Python. Wenn Sie jedoch eine .py-Datei als importiertes Modul ausführen, wird sie von python kompiliert und gespeichert. Solange sich die .py-Datei nicht ändert, wird immer die kompilierte Version verwendet.

Bei Verwendung einer beliebigen interpetierten Sprache sieht der Vorgang folgendermaßen aus:
1. Die Datei wird vom Interpeter verarbeitet.
2. Datei wird kompiliert
3. Kompilierter Code wird ausgeführt.

natürlich können Sie durch die Verwendung von vorkompiliertem Code Schritt 2 eliminieren. Dies gilt für Python, PHP und andere.

Hier ist ein interessanter Blog-Beitrag, der die Unterschiede erklärt http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
Und hier ist ein Eintrag, der den Python Kompilierungsprozess http://effbot.org/zone/python-compile.htm erklärt

9
UnkwnTech

Wie bereits erwähnt, können Sie eine Leistungssteigerung erzielen, wenn Sie Ihren python Code in Bytecode kompilieren. Dies wird normalerweise von python selbst erledigt, nur für importierte Skripte.

Ein weiterer Grund, warum Sie Ihren python Code kompilieren möchten, könnte darin bestehen, Ihr geistiges Eigentum vor dem Kopieren und/oder Ändern zu schützen.

Weitere Informationen hierzu finden Sie in der Python-Dokumentation .

8
Simon B. Jensen

Beim Ausführen eines kompilierten Skripts gibt es sicherlich einen Leistungsunterschied. Wenn Sie normal laufen .py Skripte, die Maschine kompiliert es jedes Mal, wenn es ausgeführt wird, und dies braucht Zeit. Auf modernen Maschinen ist dies kaum zu bemerken, aber wenn das Skript wächst, kann es zu einem größeren Problem werden.

7
matpie

Unberührt bleibt Source-to-Source-Compiling . Beispielsweise übersetzt nuitka Python Code in C/C++ und kompiliert ihn in Binärcode, der direkt auf der CPU ausgeführt wird, anstelle von Python = Bytecode, der auf der langsameren virtuellen Maschine ausgeführt wird.

Dies kann zu erheblichen Beschleunigungen führen, oder Sie können mit Python arbeiten, während Ihre Umgebung von C/C++ - Code abhängt.

5
user258532

Wir verwenden kompilierten Code, um ihn an Benutzer zu verteilen, die keinen Zugriff auf den Quellcode haben. Grundsätzlich, um unerfahrene Programmierer davon abzuhalten, versehentlich etwas zu ändern oder Fehler zu beheben, ohne es uns mitzuteilen.

4
DrBwts

Ja, Leistung ist der Hauptgrund und, soweit ich weiß, der einzige Grund.

Wenn einige Ihrer Dateien nicht kompiliert werden, kann Python nicht in die .pyc-Datei schreiben, möglicherweise wegen der Verzeichnisberechtigungen oder ähnlichem. Oder die nicht kompilierten Dateien sind einfach nicht vorhanden wird nie geladen ... (Skripte/Module werden erst kompiliert, wenn sie zum ersten Mal geladen werden)

2
David Z

Anfänger gehen davon aus, dass Python aufgrund von .pyc-Dateien kompiliert wird. Die .pyc-Datei ist der kompilierte Bytecode, der dann interpretiert wird. Wenn Sie also Python = Code vorher und die .pyc-Datei griffbereit haben, wird sie beim zweiten Mal schneller ausgeführt, da der Bytecode nicht neu kompiliert werden muss

Compiler: Ein Compiler ist ein Stück Code, der die Hochsprache in Maschinensprache übersetzt

Dolmetscher: Dolmetscher konvertieren auch die Hochsprache in maschinenlesbare binäre Äquivalente. Jedes Mal, wenn ein Interpreter einen Hochsprachencode erhält, der ausgeführt werden soll, konvertiert er den Code in einen Zwischencode, bevor er in den Maschinencode konvertiert wird. Jeder Teil des Codes wird interpretiert und dann separat in einer Sequenz ausgeführt. Wenn ein Fehler in einem Teil des Codes gefunden wird, wird die Interpretation des Codes gestoppt, ohne dass der nächste Satz der Codes übersetzt wird.

Quellen: http://www.toptal.com/python/why-are-there-so-many-pythonshttp://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter

1
Beginner