Frage

Mir wurde verstehen, dass Python eine interpretierte Sprache ist ... wenn ich meinen Python -Quellcode jedoch sehe .pyc Dateien, die Windows als "kompilierte Python -Dateien" identifiziert. Wo kommen diese ins Spiel?

War es hilfreich?

Lösung

Sie beinhalten Byte -Code, wofür der Python -Dolmetscher die Quelle zusammenstellt. Dieser Code wird dann von Pythons virtueller Maschine ausgeführt.

Pythons Dokumentation erklärt die Definition wie folgt:

Python ist eine interpretierte Sprache im Gegensatz zu einer kompilierten, obwohl die Unterscheidung aufgrund des Vorhandenseins des Bytecode -Compilers verschwommen sein kann. Dies bedeutet, dass Quelldateien direkt ausgeführt werden können, ohne explizit eine ausführbare Datei zu erstellen, die dann ausgeführt wird.

Andere Tipps

Ich wurde gegeben, um zu verstehen, dass Python eine interpretierte Sprache ist ...

Dieses beliebte Meme ist falsch oder eher auf einem Missverständnis von (natürlichen) Sprachniveaus: Ein ähnlicher Fehler wäre zu sagen "Die Bibel ist ein Hardcover -Buch". Lassen Sie mich dieses Gleichnis erklären ...

"Die Bibel" ist "ein Buch" im Sinne eines Seins a Klasse von (tatsächlichen physikalischen Objekten identifiziert als) Bücher; Die als "Kopien der Bibel" identifizierten Bücher sollen etwas Grundlegendes gemeinsam haben (der Inhalt, obwohl selbst diese in verschiedenen Sprachen mit unterschiedlichen akzeptablen Übersetzungen, Fußnoten und anderen Anmerkungen vorhanden sein können) - diese Bücher sind jedoch diese Bücher vollkommen gut erlaubt, sich in einer Vielzahl von Aspekten zu unterscheiden, die sind nicht als grundlegend angesehen - Art der Bindung, Farbe der Bindung, Schriftart (en), die im Druck verwendet werden, Illustrationen, wenn überhaupt, beschreibbare Ränder oder nicht, Zahlen und Arten von gebauten Lesezeichen usw. usw.

Es ist durchaus möglich, dass a typisch Das Drucken der Bibel würde in der Tat in Hardcover-Bindung sein-schließlich ist es ein Buch, das normalerweise immer wieder gelesen werden soll, an mehreren Orten mit einem Lesezeichen versehen, durch die Suche nach gegebenen Kapiteln und Ververtäern usw. usw. Eine gute Hardcover -Bindung kann eine bestimmte Kopie unter solchen Verwendung länger dauern. Dies sind jedoch weltliche (praktische) Probleme, die nicht verwendet werden können, um festzustellen, ob ein bestimmtes Buchobjekt eine Kopie der Bibel ist oder nicht: Taschenbücher druckt durchaus möglich!

In ähnlicher Weise ist Python "eine Sprache" im Sinne einer Klasse von Sprache Implementierungen was alle in einigen grundlegenden Hinweisen ähnlich sein müssen (Syntax, die meisten Semantik, außer den Teilen derer, in denen sie sich ausdrücklich unterscheiden können), dürfen sich jedoch in nahezu allen "Implementierungsdetails" vollständig unterscheiden - einschließlich der Art und Weise, wie sie mit dem umgehen Quelldateien, die sie angegeben sind, ob sie die Quellen in einige Formulare mit niedrigerer Ebene kompilieren (und wenn ja, welches Form .

Die klassische Implementierung, CPython, wird oft als kurz als "Python" bezeichnet-aber es ist nur eine von mehreren Produktionsqualität implementiert, nebeneinander mit Microsofts Ironpython (das zu CLR-Codes kompiliert, dh .NET ".NET"), Jython, Jython), Jython (Was für JVM-Codes kompiliert), pypy (die in Python selbst geschrieben ist und eine Vielzahl von "Back-End" -Formen wie "Just-in-Time" -Maschinensprache kompilieren kann). Sie sind alle Python (== "Implementierungen der Python -Sprache"), genau wie viele oberflächlich verschiedene Buchobjekte alle Bibeln sein können (== "Kopien der Bibel").

Wenn Sie sich speziell an CPython interessieren: Es kompiliert die Quelldateien in ein pythonspezifisches Formular mit unterer Ebene (bezeichnet als "Bytecode"), dies automatisch bei Bedarf (wenn keine Bytecode-Datei entsprechend einer Quelldatei entsprechend ist, oder Die Bytecode -Datei ist älter als die Quelle oder kompiliert von einer anderen Python -Version), speichert die Bytecode -Dateien normalerweise auf Festplatten (um sie in Zukunft neu zu kompilieren). Otoh Ironpython kompiliert normalerweise mit CLR -Codes (abhängig von der Festplatte oder nicht auf Scheibe oder nicht) und Jython auf JVM -Codes (speichern Sie sie auf der Festplatte oder nicht - es wird das verwenden .class Erweiterung, wenn es sie speichert).

Diese Formen auf niedrigerer Ebene werden dann von geeigneten "virtuellen Maschinen" ausgeführt, auch als "Dolmetscher" bezeichnet - die CPython VM, die .NET -Laufzeit, die Java VM (AKA JVM), gegebenenfalls.

In diesem Sinne (was tun typische Implementierungen) ist Python eine "interpretierte Sprache", wenn C# und Java sind: Alle haben eine typische Implementierungsstrategie zur Erzeugung von Bytecode zuerst und führen sie dann über ein VM/Interpreter aus .

Wahrscheinlicher liegt der Fokus darauf, wie "schwer", langsam und hohe Zeremonie der Zusammenstellungsprozess ist. CPython ist so konzipiert, dass sie so schnell wie möglich, so leicht wie möglich, mit einer so wenig Zeremonie wie machbar kompiliert werden - der Compiler führt nur sehr wenig Fehlerprüfung und Optimierung durch Seien Sie automatisch und transparent ausgeführt, ohne dass der Benutzer überhaupt darüber wissen muss, dass die meisten Zeit eine Zusammenstellung vorliegt. Java und C# akzeptieren in der Regel mehr Arbeit während der Zusammenstellung (und daher keine automatische Zusammenstellung durchführen), um Fehler gründlicher zu überprüfen und mehr Optimierungen durchzuführen. Es ist ein Kontinuum von grauen Schuppen, keine schwarze oder weiße Situation, und es wäre absolut willkürlich, einen Schwellenwert auf ein bestimmtes Niveau zu setzen und zu sagen, dass Sie es nur über diesem Niveau als "Zusammenstellung" nennen!-)

Es gibt keine interpretierte Sprache. Ob ein Dolmetscher oder ein Compiler verwendet wird Implementierung Und hat absolut nichts mit der Sprache zu tun.

Jeder

Sinn, weil eine Sprache kann noch nie definiert als "interpretiert".

Insbesondere wenn Sie sich die derzeit vorhandenen Python -Implementierungen ansehen, sind dies die Implementierungsstrategien, die sie verwenden:

  • Ironpython: Kompiliert zu DLR -Bäumen, die der DLR dann zum CIL -Bytecode kompiliert. Was mit dem CIL -Bytecode passiert, hängt davon ab, auf welchen Cli -Ves Sie ausführen, aber Microsoft .NET, GNU Portable.net und Novell Mono werden ihn schließlich zum nativen Maschinencode kompilieren.
  • Jython: Interpretiert Python Sourcecode, bis es die Hot Code -Pfade identifiziert, die sie dann zu JVML -Bytecode kompiliert. Was mit dem JVML -Bytecode passiert, hängt davon ab, auf welcher JVM Sie laufen. Maxine wird es direkt zu einem nicht optimierten nativen Code kompilieren, bis er die Hot Code-Pfade identifiziert, die er dann zu einem optimierten nativen Code neu kompiliert. Hotspot interpretiert zuerst den JVML -Bytecode und kompile dann schließlich die Hotcodepfade in einen optimierten Maschinencode.
  • PYPY: Kompiliert zu PYPY -Bytecode, das dann von der PYPY VM interpretiert wird, bis es die Hot -Code -Pfade identifiziert, die sie dann in nativen Code, JVML -Bytecode oder CIL -Bytecode kompiliert, je nachdem, auf welcher Plattform Sie ausführen.
  • CPython: Kompiliert zu CPython -Bytecode, das es dann interpretiert.
  • Stackless Python: Kompiliert zu CPython -Bytecode, das es dann interpretiert.
  • UNLADEN SWAWLE: Kompiliert zu CPython -Bytecode, das dann interpretiert wird, bis es die Hotcodepfade identifiziert, die es dann zu LLVM IR kompiliert, den der LLVM -Compiler dann zum nativen Maschinencode kompilt.
  • Cython: Kompiliert Python -Code in den tragbaren C -Code, der dann mit einem Standard -C -Compiler zusammengestellt wird
  • Nuitka: Kompiliert Python-Code in maschinell abhängigen C ++-Code, der dann mit einem Standard-C-Compiler zusammengestellt wird

Der Begriff "interpretierter Sprache" macht nicht nur keinen Sinn, auch wenn Sie ihn als Bedeutung "Sprache mit interpretierter Implementierung" interpretieren, er ist eindeutig nicht wahr. Wer Ihnen das gesagt hat, weiß offensichtlich nicht, wovon er spricht.

Insbesondere die .pyc Dateien, die Sie sehen, sind zwischengespeicherte Bytecode -Dateien, die von CPython, Stackless Python oder Unladen Swallow erstellt wurden.

Diese werden vom Python -Dolmetscher erstellt, wenn a .py Die Datei wird importiert und enthalten das "kompilierte Bytecode" des importierten Moduls/Programms, wobei die Idee ist imports Wenn die .pyc ist neuer als die entsprechend .py Datei, so dass das Start ein wenig beschleunigt wird. Aber es wird immer noch interpretiert.

Um die Lademodule zu beschleunigen, zwischengespeichert Python den kompilierten Gehalt von Modulen in .pyc.

CPython kompiliert seinen Quellcode in "Byte -Code" und zwischen Leistungsgründen zwischen dem Byte -Code im Dateisystem, wenn die Quelldatei Änderungen hat. Dies macht das Laden von Python -Modulen viel schneller, da die Zusammenstellungsphase umgangen werden kann. Wenn Ihre Quelldatei foo.py ist, zwischengespeichert CPython den Byte -Code in einer foo.pyc -Datei direkt neben der Quelle.

In Python3 wird die Importmaschinerie von Python in einem einzigen Verzeichnis in jedem Python -Paketverzeichnis erweitert und nach Byte -Code -Cache -Dateien suchen. Dieses Verzeichnis wird __pycache__ genannt.

Hier ist ein Flussdiagramm, in dem beschrieben wird, wie Module geladen werden:

enter image description here

Für mehr Informationen:

Ref:PEP3147
Ref:"Kompilierte" Python -Dateien "kompiliert"

Dies ist für Anfänger,

Python kompiliert Ihr Skript automatisch zum kompilierten Code, den sogenannten Byte -Code, bevor es ausgeführt wird.

Das Ausführen eines Skripts wird nicht als Import betrachtet und es wird nein .pyc erstellt.

Zum Beispiel, wenn Sie eine Skriptdatei haben ABC.PY Das importiert ein anderes Modul xyz.py, wenn du rennst ABC.PY, xyz.pyc wird erstellt, da XYZ importiert wird, aber keine ABC.pyc -Datei ist erstellt da ABC.py nicht importiert wird.

Wenn Sie eine .pyc -Datei für ein nicht importiertes Modul erstellen müssen, können Sie die verwenden py_compile und compileall Module.

Das py_compile Das Modul kann jedes Modul manuell kompilieren. Eine Möglichkeit besteht darin, die zu verwenden py_compile.compile Funktion in diesem Modul interaktiv:

>>> import py_compile
>>> py_compile.compile('abc.py')

Dadurch wird das .pyc an denselben Ort wie ABC.Py geschrieben (Sie können dies mit dem optionalen Parameter überschreiben cfile).

Sie können auch automatisch alle Dateien in einem Verzeichnis oder Verzeichnis mit dem CompileAll -Modul kompilieren.

python -m compileall

Wenn der Verzeichnisname (das aktuelle Verzeichnis in diesem Beispiel) weggelassen wird, kompiliert das Modul alles, auf dem gefunden wurde sys.path

Python (zumindest die häufigste Implementierung davon) folgt einem Muster, mit dem die ursprüngliche Quelle zu Byte -Codes zusammengestellt und dann die Byte -Codes auf einer virtuellen Maschine interpretiert wird. Dies bedeutet (wiederum die häufigste Implementierung) weder ein reiner Dolmetscher noch ein reiner Compiler.

Die andere Seite davon ist jedoch, dass der Zusammenstellungsprozess größtenteils versteckt ist - die .pyc -Dateien werden im Grunde genommen wie ein Cache behandelt. Sie beschleunigen die Dinge, aber Sie müssen sich normalerweise überhaupt nicht bewusst sein. Es lädt sie automatisch ungültig und lädt sie bei Bedarf auf basierend auf Dateizeit-/Datumsstempeln neu.

Ungefähr das einzige Mal, dass ich ein Problem damit gesehen habe, war, als eine kompilierte Bytecode -Datei irgendwie einen Zeitstempel bis in die Zukunft erhielt, was bedeutete, dass sie immer neuer aussah als die Quelldatei. Da es neuer aussah, wurde die Quelldatei nie neu kompiliert, egal welche Änderungen Sie vorgenommen haben, sie wurden ignoriert ...

Pythons *.py -Datei ist nur eine Textdatei, in der Sie einige Codezeilen schreiben. Wenn Sie versuchen, diese Datei mit "Python Dateiname.py" auszuführen

Dieser Befehl ruft die virtuelle Python -Maschine auf. Python Virtual Machine verfügt über 2 Komponenten: "Compiler" und "Interpreter". Interpreter kann den Text in *.py -Datei nicht direkt lesen (nicht Hardware, aber PVM). PVM führt diesen Byte -Code aus. *.PYC -Datei wird ebenfalls im Rahmen des Ausführens des Ausführens Ihrer Importoperation in der Datei in Shell oder in einer anderen Datei generiert.

Wenn diese *.pyc -Datei bereits generiert ist, lädt das System jedes nächste Mal, wenn Sie Ihre *.py -Datei ausführen, Ihre *.pyc -Datei direkt, für die keine Kompilierung erforderlich ist (dies spart einige Maschinenzyklen des Prozessors).

Sobald die *.pyc -Datei generiert wurde, ist keine *.py -Datei erforderlich, es sei denn, Sie bearbeiten sie.

Der Python -Code durchläuft 2 Stufen. Erster Schritt kompiliert den Code in .pyc -Dateien, die eigentlich ein Bytecode sind. Dann wird diese .pyc -Datei (Bytecode) mit CPython -Interpreter interpretiert. Bitte beziehen Sie sich auf Dies Verknüpfung. Hier wird der Prozess der Codekompilierung und -ausführung in einfachen Worten erläutert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top