Warum sollten 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 stelle auch fest, dass einige Dateien in meiner Anwendung in .pyc kompiliert werden, während andere dies nicht tun. Warum ist das so?
python
compilation
Ryeguy
quelle
quelle
import mylib.py
, wird Python kompiliert,mylib.py
sodass zukünftigeimport
Anweisungen etwas schneller ausgeführt werden. Wenn Sie später ändernmylib.py
, wird es beim nächsten Import neu kompiliert (Python verwendet dasAntworten:
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, mit dem Sie aufrufen,
python main.py
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 :
quelle
Die .pyc-Datei ist Python, die bereits zu Bytecode kompiliert wurde. Python führt automatisch eine .pyc-Datei aus, wenn es eine mit demselben Namen wie eine von Ihnen aufgerufene .py-Datei findet.
"Eine Einführung in Python" sagt dies über kompilierte Python-Dateien:
Der Vorteil des Ausführens einer .pyc-Datei besteht darin, dass Python vor dem Ausführen keinen zusätzlichen Aufwand für das Kompilieren verursachen muss. Da Python ohnehin vor dem Ausführen einer .py-Datei zu Bytecode kompilieren würde, sollte es ansonsten 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" druckt, kann das Kompilieren einen großen Prozentsatz der gesamten Start- und Laufzeit ausmachen. Bei länger laufenden Skripten verringern sich jedoch die Kosten für das Kompilieren eines Skripts im Verhältnis zur Gesamtlaufzeit.
Das Skript, das Sie in der Befehlszeile benennen, wird niemals in einer .pyc-Datei gespeichert. Auf diese Weise werden nur Module gespeichert, die von diesem "Hauptskript" geladen wurden.
quelle
Pluspunkte:
Erstens: milde, besiegbare 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 bei Anfangslast. Schön für die CPU und das Web.
Viertens: Je mehr Sie kommentieren, desto kleiner ist die Datei
.pyc
oder.pyo
im Vergleich zur Quelle.py
.Fünftens: ein Endbenutzer mit nur einem
.pyc
oder.pyo
Datei in der Hand hat, zeigt Ihnen mit viel geringerer Wahrscheinlichkeit einen Fehler, der durch eine nicht rückgängig gemachte Änderung verursacht wurde, von der er vergessen hat, Ihnen davon zu erzählen.Sechstens: Wenn Sie auf ein eingebettetes System abzielen, kann das Erhalten einer Datei mit kleinerer Größe zum Einbetten ein erhebliches Plus darstellen, und die Architektur ist stabil, sodass der unten beschriebene Nachteil nicht ins Spiel kommt.
Top Level Compilation
Es ist hilfreich zu wissen, dass Sie eine Python-Quelldatei der obersten Ebene folgendermaßen in eine
.pyc
Datei kompilieren können:Dadurch werden Kommentare entfernt. Es lässt
docstrings
intakt. Wenn Sie das auch loswerdendocstrings
möchten (Sie möchten vielleicht ernsthaft darüber nachdenken, warum Sie das tun), kompilieren Sie stattdessen auf diese Weise ...... und Sie erhalten eine
.pyo
Datei anstelle einer.pyc
Datei; In Bezug auf die wesentliche Funktionalität des Codes gleichermaßen verteilbar, jedoch kleiner um die Größe des abgespeckten Codesdocstrings
(und für eine spätere Beschäftigung weniger leicht zu verstehen, wenn er anständig wardocstrings
). Aber siehe Nachteil drei unten.Beachten Sie, dass Python
.py
das Datum der Datei verwendet, falls vorhanden, um zu entscheiden, ob die.py
Datei im Gegensatz zur Datei.pyc
oder ausgeführt.pyo
werden soll. Bearbeiten Sie also Ihre .py-Datei, und das.pyc
oder.pyo
ist veraltet, und alle Vorteile, die Sie erhalten haben, gehen verloren. Sie müssen es neu kompilieren, um die.pyc
oder die.pyo
Vorteile wieder zu erhalten, wie sie möglicherweise sind.Nachteile:
Erstens: Es gibt ein "magisches Cookie"
.pyc
und.pyo
Dateien, die die Systemarchitektur angeben, in der die Python-Datei kompiliert wurde. Wenn Sie eine dieser Dateien in eine Umgebung eines anderen Typs verteilen, wird sie beschädigt. Wenn Sie das.pyc
oder.pyo
ohne das zugeordnete.py
Neukompilieren verteilen odertouch
es das.pyc
oder ersetzt.pyo
, kann der Endbenutzer es auch nicht reparieren.Zweitens: Wenn
docstrings
die Verwendung der-OO
Befehlszeilenoption wie oben beschrieben übersprungen wird, kann niemand auf diese Informationen zugreifen, was die Verwendung des Codes erschweren (oder unmöglich machen) kann.Drittens: Die
-OO
Option von Python implementiert auch einige Optimierungen gemäß der-O
Befehlszeilenoption. Dies kann zu Betriebsänderungen führen. Bekannte Optimierungen sind:sys.flags.optimize
= 1assert
Anweisungen werden übersprungen__debug__
= FalschViertens: Wenn Sie Ihr Python-Skript absichtlich mit etwas in der Reihenfolge
#!/usr/bin/python
in der ersten Zeile ausführbar gemacht haben , wird dies in.pyc
und.pyo
Dateien entfernt und diese Funktionalität geht verloren.Fünftens: etwas offensichtlich, aber wenn Sie Ihren Code kompilieren, kann nicht nur seine Verwendung beeinträchtigt werden, sondern das Potenzial für andere, aus Ihrer Arbeit zu lernen, wird häufig erheblich verringert.
quelle
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 jeder Interpeted-Sprache, wenn die Datei verwendet wird, sieht der Prozess ungefähr so aus:
1. Die Datei wird vom Interpeter verarbeitet.
2. Datei wird kompiliert
3. Kompilierter Code wird ausgeführt.
Natürlich können Sie mit 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 erklärt http://effbot.org/zone /python-compile.htm
quelle
Wie bereits erwähnt, können Sie eine Leistungssteigerung erzielen, wenn Sie Ihren Python-Code in Bytecode kompilieren lassen. 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 .
quelle
Es gibt sicherlich einen Leistungsunterschied beim Ausführen eines kompilierten Skripts. Wenn Sie normale
.py
Skripte ausführen , kompiliert der Computer diese bei jeder Ausführung, was einige Zeit in Anspruch nimmt. Auf modernen Maschinen ist dies kaum wahrnehmbar, aber wenn das Skript wächst, kann es zu einem größeren Problem werden.quelle
Etwas, das nicht angesprochen wird, ist das Kompilieren von Quelle zu Quelle . Beispielsweise,
nuitka
übersetzt Python - Code zu C / C ++, und kompiliert es auf Binär - Code, der auf der CPU direkt ausgeführt wird , anstelle von Python - Bytecode , die 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.
quelle
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.
quelle
Ja, Leistung ist der Hauptgrund und, soweit ich weiß, der einzige Grund.
Wenn einige Ihrer Dateien nicht kompiliert werden, kann Python möglicherweise nicht in die .pyc-Datei schreiben, möglicherweise aufgrund der Verzeichnisberechtigungen oder Ähnlichem. Oder vielleicht werden die nicht kompilierten Dateien nie geladen ... (Skripte / Module werden erst kompiliert, wenn sie zum ersten Mal geladen werden)
quelle
Anfänger gehen davon aus, dass Python aufgrund von .pyc-Dateien kompiliert wurde. Die .pyc-Datei ist der kompilierte Bytecode, der dann interpretiert wird. Wenn Sie also Ihren Python-Code zuvor ausgeführt haben und die .pyc-Datei zur Hand haben, wird sie beim zweiten Mal schneller ausgeführt, da der Bytecode nicht neu kompiliert werden muss
Compiler: Ein Compiler ist ein Code, der die Hochsprache in Maschinensprache übersetzt
Dolmetscher: Dolmetscher konvertieren die Hochsprache auch in maschinenlesbare binäre Äquivalente. Jedes Mal, wenn ein Interpreter einen High-Level-Sprachcode zur Ausführung erhält, konvertiert er den Code in einen Zwischencode, bevor er ihn in den Maschinencode konvertiert. Jeder Teil des Codes wird interpretiert und dann separat in einer Sequenz ausgeführt. In einem Teil des Codes wird ein Fehler gefunden, der die Interpretation des Codes stoppt, ohne den nächsten Satz der Codes zu übersetzen.
Quellen: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter
quelle