Nach meinem Verständnis liegt der Grund für den Geschwindigkeitsunterschied zwischen kompilierten Sprachen und Python darin, dass der erste Code vollständig zum Code des nativen Computers kompiliert wird, während Python zu Python-Bytecode kompiliert wird, der vom PVM interpretiert wird. Ich sehe, dass auf diese Weise Python-Codes auf mehreren Betriebssystemen verwendet werden können (zumindest in den meisten Fällen), aber ich verstehe nicht, warum es keinen zusätzlichen (und optionalen) Compiler für Python gibt, der genauso kompiliert wie herkömmliche Compiler . Dies würde es dem Programmierer überlassen, auszuwählen, was für ihn wichtiger ist. Multiplattform-Ausführbarkeit oder -Leistung auf nativen Computern. Im Allgemeinen; warum gibt es keine sprachen, die sich sowohl kompiliert als auch interpretiert verhalten könnten?
quelle
Antworten:
Nein. Der Grund für die Geschwindigkeitsunterschiede zwischen Sprachen wie Python und C ++ liegt darin, dass statisch typisierte Sprachen dem Compiler unzählige Informationen über die Struktur des Programms und seine Daten liefern, die es ihm ermöglichen, sowohl Berechnungen als auch den Speicherzugriff zu optimieren. Da C ++ weiß, dass eine Variable vom Typ int ist, kann es bereits vor dem Ausführen des Programms bestimmen, wie diese Variable optimal manipuliert werden kann. In Python hingegen weiß die Laufzeit erst, welcher Wert in einer Variablen enthalten ist, wenn der Interpreter die Zeile erreicht hat. Dies ist äußerst wichtig für Strukturen, bei denen der Compiler in C ++ die Größe der Struktur und jede Position ihrer Felder im Speicher während der Kompilierung leicht erkennen kann. Dies gibt ihm eine enorme Aussagekraft bei der Vorhersage, wie die Daten verwendet werden könnten, und ermöglicht eine Optimierung gemäß diesen Vorhersagen.
Um Sprachen wie Python effektiv zu kompilieren, müssten Sie:
quelle
eval
, und eine Reihe anderer Dinge, die Compiler-Autoren traurig machen. Es ist nicht auf dem Niveau von gcc, aber es ist sicherlich schneller als CPythons Interpreter.Zwei Konzepte helfen uns möglicherweise dabei, besser zu verstehen, warum Python, das mit nativem Maschinencode kompiliert wurde, möglicherweise nicht so schnell ausgeführt wird wie kompiliertes C oder andere häufig kompilierte Sprachen. Sie werden als Frühbindung und Spätbindung bezeichnet.
Zunächst sollte ich sagen, dass ich kein Python-Experte bin und zufällig auf diese Site gekommen bin. Aber ich mag diese Seite.
Wie in einer anderen Antwort erwähnt, kann der C ++ - Compiler viel über das Programm wissen und Entscheidungen darüber treffen, welche Operationen für bestimmte Datenstrukturen verwendet werden sollen. Wenn beispielsweise zwei Ganzzahlvariablen zusammenaddiert werden müssen, weiß der Compiler, dass es sich um native Ganzzahlen handelt, die beispielsweise 32 Bit breit sind, und kann sie mit einem "ADD" -Befehl zusammenaddieren. So kompiliert es den ADD-Befehl in den Code. Es ist gesperrt und kann nicht geändert werden, während das Programm ausgeführt wird. Das ist frühzeitig verbindlich.
Andererseits können wir in einer Sprache wie Python erwarten, dass das Programm verschiedene Datentypen auf komplexe Weise zusammenführt. Der Compiler weiß jetzt nicht, ob es sich bei unseren 2 Variablen um Ganzzahlen, Gleitkommazahlen, Zeichenfolgen oder Listen handelt. Daher muss Code kompiliert werden, der diese Informationen zur Laufzeit ermittelt, und der richtige Vorgang muss ausgewählt werden, während das Programm ausgeführt wird. Dies ist eine späte Bindung und wir können verstehen, dass es einen Leistungseinbruch geben wird, wenn Sie diese zusätzliche Arbeit ausführen, während das Programm ausgeführt wird. Es ist der Preis, den Sie zahlen, wenn Sie diese Optionen in einer Sprache wie Python offen halten, aber es bietet maximale Laufzeitflexibilität.
quelle
Ich denke, es hat mehr mit den Python-Besonderheiten selbst zu tun, der gleiche Grund, warum Sie C # nicht in Maschinencode kompilieren können. Sprachspezifische Besonderheiten würden Ihre Programme sogar dann fehlerhaft machen, wenn dies aufgrund der Art der Sprache möglich wäre. Warum nicht einfach die C-Sprache lernen? Es ist viel einfacher als C ++ und etwas fortgeschrittener als Python, aber dennoch zugänglich.
quelle