635 Stimmen

Python vs Cpython

Worum geht es bei all dem Wirbel um Python und CPython (Jython, IronPython), ich verstehe es nicht:

python.org erwähnt, dass CPython ist:

Die "traditionelle" Implementierung von Python (Spitzname CPython)

noch eine weitere Stack Overflow Frage erwähnt, dass:

CPython ist der Standard-Bytecode-Interpreter von Python, der in C geschrieben ist.

Ehrlich gesagt verstehe ich nicht, was beide Erklärungen praktisch bedeuten, aber was ich dachte war, wenn ich CPython verwende, bedeutet das, dass wenn ich einen Beispiel-Python-Code ausführe, er ihn in die C-Sprache übersetzt und dann ausführt, als ob es C-Code wäre

Was genau ist also CPython und wie unterscheidet es sich im Vergleich zu Python und sollte ich wahrscheinlich CPython anstelle von Python verwenden und wenn ja, welche Vorteile hat es?

931voto

Martijn Pieters Punkte 953257

Also, was ist CPython?

CPython ist die ursprüngliche Python-Implementation. Es ist die Implementierung, die Sie von Python.org herunterladen. Die Leute nennen es CPython, um es von anderen, späteren Python-Implementierungen zu unterscheiden und um die Implementierung des Sprachmotors von der Python Programmiersprache selbst zu unterscheiden.

Der letzte Teil ist, wo Ihre Verwirrung herkommt; Sie müssen Python-die-Sprache von dem, was auch immer den Python-Code ausführt, trennen.

CPython ist zufälligerweise in C implementiert. Das ist wirklich nur ein Implementierungsdetail. CPython übersetzt Ihren Python-Code (transparent) in Bytecode und interpretiert diesen Bytecode in einer Auswertungsschleife.

CPython ist auch der erste, der neue Funktionen implementiert; die Python-die-Sprache-Entwicklung verwendet CPython als Basis; andere Implementierungen folgen.

Was ist mit Jython, etc.?

Jython, IronPython und PyPy sind die aktuellen "anderen" Implementierungen der Python-Programmiersprache; diese sind jeweils in Java, C# und RPython (eine Untermenge von Python) implementiert. Jython übersetzt Ihren Python-Code in Java-Bytecode, sodass Ihr Python-Code auf der JVM ausgeführt werden kann. IronPython ermöglicht es Ihnen, Python auf dem Microsoft CLR auszuführen. Und PyPy, das in (einer Untermenge von) Python implementiert ist, ermöglicht es Ihnen, Python-Code schneller als CPython auszuführen, was Sie zu Recht verblüffen sollte. :-)

Eigentlich Übersetzung in C

CPython übersetzt Ihren Python-Code nicht automatisch in C. Stattdessen führt es eine Interpreter-Schleife aus. Es gibt ein Projekt, das Python-ähnlichen Code in C übersetzt, und das heißt Cython. Cython fügt einige Erweiterungen zur Python-Sprache hinzu und ermöglicht es Ihnen, Ihren Code in C-Erweiterungen zu kompilieren, Code, der in den CPython-Interpreter eingebunden wird.

130voto

jamylak Punkte 119693

Sie müssen zwischen einer Sprache und einer Implementierung unterscheiden. Python ist eine Sprache.

Laut Wikipedia ist "Eine Programmiersprache eine Notation zum Schreiben von Programmen, die Spezifikationen einer Berechnung oder eines Algorithmus sind". Das bedeutet, dass es einfach die Regeln und die Syntax zum Schreiben von Code sind. Getrennt davon haben wir eine Programmiersprache Implementierung, die in den meisten Fällen der eigentliche Interpreter oder Kompiler ist.

Python ist eine Sprache. CPython ist die Implementierung von Python in C. Jython ist die Implementierung in Java, und so weiter.

Zusammenfassend: Sie verwenden bereits CPython (wenn Sie es von hier heruntergeladen haben).

71voto

Vijay Kumar Punkte 832

Sogar ich hatte das gleiche Problem zu verstehen, wie sich CPython, JPython, IronPython, PyPy voneinander unterscheiden.

Deshalb bin ich bereit, drei Dinge zu klären, bevor ich anfange zu erklären:

  1. Python: Es ist eine Sprache, sie gibt nur an/beschreibt, wie man sich dem Interpreter (dem Programm, das Ihren Python-Code akzeptiert) gegenüber ausdrücken kann.
  2. Implementierung: Es geht darum, wie der Interpreter geschrieben wurde, speziell in welcher Sprache und was er letztendlich tut.
  3. Bytecode: Es ist der Code, der von einem Programm verarbeitet wird, normalerweise als virtuelle Maschine bezeichnet, anstatt von der "echten" Computer-Maschine, dem Hardware-Prozessor.

CPython ist die Implementierung, die in der C-Sprache geschrieben wurde. Es produziert Bytecode (stackbasierten Instruktionssatz), der spezifisch für Python ist, und führt ihn dann aus. Der Grund, Python-Code in einen Bytecode umzuwandeln, besteht darin, dass es einfacher ist, ein Interpreter zu implementieren, wenn er wie Maschinenanweisungen aussieht. Es ist jedoch nicht notwendig, vor der Ausführung des Python-Codes einen Bytecode zu erzeugen (aber CPython erzeugt ihn).

Wenn Sie den Bytecode von CPython betrachten möchten, können Sie das tun. So geht's:

>>> def f(x, y):                # Zeile 1
...    print("Hello")           # Zeile 2
...    if x:                    # Zeile 3
...       y += x                # Zeile 4
...    print(x, y)              # Zeile 5
...    return x+y               # Zeile 6
...                             # Zeile 7
>>> import dis                  # Zeile 8
>>> dis.dis(f)                  # Zeile 9
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello')
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_FAST                0 (x)
             10 POP_JUMP_IF_FALSE       20

  4          12 LOAD_FAST                1 (y)
             14 LOAD_FAST                0 (x)
             16 INPLACE_ADD
             18 STORE_FAST               1 (y)

  5     >>   20 LOAD_GLOBAL              0 (print)
             22 LOAD_FAST                0 (x)
             24 LOAD_FAST                1 (y)
             26 CALL_FUNCTION            2
             28 POP_TOP

  6          30 LOAD_FAST                0 (x)
             32 LOAD_FAST                1 (y)
             34 BINARY_ADD
36 RETURN_VALUE

Nun werfen wir einen Blick auf den obigen Code. Die Zeilen 1 bis 6 sind eine Funktionsdefinition. In Zeile 8 importieren wir das Modul 'dis', das zum Anzeigen des Zwischen-Python-Bytecodes (oder Sie können auch sagen, zum Disassemblieren des Python-Bytecodes) verwendet werden kann, der von CPython (Interpreter) generiert wurde.

ANMERKUNG: Ich habe den Link zu diesem Code aus dem #python IRC-Kanal erhalten: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Und dann gibt es Jython, das in Java geschrieben ist und Java-Bytecode generiert. Der Java-Bytecode läuft auf der Java-Laufzeitumgebung, die eine Implementierung der Java Virtual Machine (JVM) ist. Wenn dies verwirrend ist, dann vermute ich, dass Sie keine Ahnung haben, wie Java funktioniert. In einfachen Worten: Der Java-Code (die Sprache, nicht der Compiler) wird vom Java-Compiler übernommen und es wird eine Datei ausgegeben (die Java-Bytecode ist), die nur mit einer JRE ausgeführt werden kann. Dies wird gemacht, damit der einmal kompilierte Java-Code in Java-Bytecode-Format auf andere Maschinen portiert werden kann, der nur von JRE ausgeführt werden kann. Wenn dies immer noch verwirrend ist, können Sie einen Blick auf diese Webseite werfen.

Hier könnten Sie fragen, ob der Bytecode von CPython portabel ist wie bei Jython, aber ich vermute, nein. Der im CPython-Implementierung produzierte Bytecode war spezifisch für diesen Interpreter, um die weitere Ausführung des Codes zu erleichtern (Ich vermute auch, dass solche Zwischen-Bytecode-Produktion, nur aufgrund der Einfachheit der Verarbeitung, in vielen anderen Interpretern durchgeführt wird).

Also, bei Jython, wenn Sie Ihren Python-Code kompilieren, erhalten Sie Java-Bytecode, der auf einer JVM ausgeführt werden kann.

Ebenso übersetzt IronPython (geschrieben in C#-Sprache) Ihren Python-Code in Common Language Runtime (CLR), eine ähnliche Technologie wie JVM, entwickelt von Microsoft.

38voto

shaktimaan Punkte 11440

Dieses Artikel erklärt grundlegend den Unterschied zwischen verschiedenen Implementierungen von Python. Wie im Artikel erwähnt wird:

Das erste, was man erkennen muss, ist dass 'Python' eine Schnittstelle ist. Es gibt eine Spezifikation, was Python tun und wie es sich verhalten soll (wie bei jeder Schnittstelle). Und es gibt mehrere Implementierungen (wie bei jeder Schnittstelle).

Das zweite, was man erkennen muss, ist dass 'interpretiert' und 'kompiliert' Eigenschaften einer Implementierung sind, nicht einer Schnittstelle.

38voto

debanjanbe Punkte 428

Da Python Open Source ist, können wir Python entsprechend unseren Anforderungen anpassen. Nach der Anpassung können wir diese Version benennen, wie wir wollen. Deshalb stehen mehrere Versionen von Python zur Verfügung. Jede Version ist eine angepasste Version von Python, um spezielle Anforderungen zu erfüllen. Es ist ähnlich wie bei den verschiedenen Versionen von UNIX, wie z.B. Ubuntu, Linux, RedHat Linux usw. Im Folgenden sind einige Versionen von Python aufgeführt:

CPython

Standardimplementierung der Python-Programmiersprache, die wir von python.org herunterladen, bereitgestellt von der Python Software Foundation. Es ist in C und Python geschrieben. Es erlaubt uns nicht, puren C-Code zu schreiben, nur Python-Code ist erlaubt. CPython kann als sowohl ein Interpreter als auch ein Compiler angesehen werden, da hier unser Python-Code zunächst in Python-Bytecode kompiliert wird und dann der Bytecode von der PVM oder Python Virtual Machine in plattformspezifische Operationen interpretiert wird. Beachten Sie, dass Interpreter vordefinierte Sprachsyntaxen haben, daher muss sie nicht in maschinenunabhängigen Maschinencode übersetzt werden. Hier führt der Interpreter den Bytecode während der Laufzeit direkt aus und führt zu plattformspezifischen Operationen.

Code-Ausführung in CPython

Ältere Versionen von JavaScript, Ruby, PHP waren vollständig interpretierte Sprachen, da ihre Interpreter jede Zeile Quellcode direkt in plattformspezifische Operationen übersetzt haben, kein Bytecode war involviert. Bytecode existiert in Java, Python, C++ (.NET), C#, um die Sprache von der Ausführungsumgebung zu trennen, d.h. für die Portabilität, schreiben Sie einmal, führen Sie überall aus. Seit 2008 hat Googles V8 JavaScript-Machine eine Just-In-Time-Compiler für JavaScript entwickelt. Er führt den JavaScript-Code zeilenweise wie ein Interpreter aus, um die Startzeit zu verkürzen, aber wenn er auf einen Hot-Section trifft, mit Code, der wiederholt ausgeführt wird, wird dieser Code mit dem Baseline- oder Optimizing-Compiler optimiert.

Cython

Cython ist eine Programmiersprache, die eine Erweiterung von Python und C darstellt. Sie ist in C und Python geschrieben. Sie ist darauf ausgelegt, C-ähnliche Leistung mit Python-Syntax und optionaler C-Syntax zu bieten. Cython ist eine kompilierte Sprache, da sie C-Code generiert und von einem C-Compiler kompiliert wird. Wir können auf ähnliche Weise Code in Cython schreiben wie in Standard-Python oder CPython, die Unterschiede sind:

  • Cython ermöglicht uns, optionalen zusätzlichen C-Code zu schreiben und,
  • In Cython wird unser Python-Code intern in C-Code übersetzt, so dass er von einem C-Compiler kompiliert werden kann. Obwohl Cython zu deutlich schnellerer Ausführung führt, aber Original-C nicht erreicht. Das liegt daran, dass Cython Aufrufe des CPython-Interpreters und der CPython-Standardbibliotheken machen muss, um den geschriebenen CPython-Code zu verstehen

Bildbeschreibung hier eingeben

JPython / Jython

Java-Implementierung der Python-Programmiersprache. Sie ist in Java und Python geschrieben. Hier wird unser Python-Code zunächst in Java-Bytecode kompiliert und dann dieser Bytecode von der JVM oder Java Virtual Machine in plattformspezifische Operationen interpretiert. Dies ist ähnlich dazu, wie Java-Code ausgeführt wird: Java-Code wird zunächst in einen Zwischencode kompiliert, der dann von der JVM in plattformspezifische Operationen interpretiert wird.

PyPy

RPython-Implementierung der Python-Programmiersprache. Sie ist in einem eingeschränkten Teilmenge von Python namens Restricted Python (RPython) geschrieben. PyPy läuft schneller als CPython, da zur Interpretation des Bytecodes PyPy einen Just-in-Time-Compiler (Interpreter + Compiler) hat, während CPython einen Interpreter hat. Der JIT-Compiler in PyPy kann daher den Python-Bytecode zeilenweise wie ein Interpreter ausführen, um die Startzeit zu verringern, aber wenn er auf eine Hot-Section trifft, wobei eine Linie des Codes wiederholt ausgeführt wird, wird dieser Code mit einem Baseline- oder Optimizing-Compiler optimiert.

PyPy-Code-Ausführung

Nachteile des JIT-Compilers: anfänglich langsamere Ausführung, wenn der Code analysiert wird, und wenn Annahmen falsch sind führt das dazu, dass der optimierte kompilierte Code verworfen wird, d.h. es kommt zur Deoptimierung oder Bailing out, was die Code-Ausführung verlangsamen kann, obwohl JIT-Compiler eine Grenze für den Optimierungs-/Deoptimisierungszyklus hat. Nach einer bestimmten Anzahl von Deoptimierungen versucht der JIT-Compiler einfach nicht mehr zu optimieren. Während ein normaler Interpreter bei jeder Iteration wiederholt den Bytecode in Maschinencode übersetzen würde, wodurch mehr Zeit benötigt wird, um eine Schleife zu durchlaufen, die z.B. eine Million Mal ausgeführt wird.

IronPython

C#-Implementierung der Python-Programmiersprache, die auf das .NET-Framework abzielt

Ruby Python

funktioniert mit der Ruby-Plattform

Anaconda Python

Distribution der Python- und R-Programmiersprachen für wissenschaftliches Rechnen wie z.B. Data Science, Maschinelles Lernen, Künstliche Intelligenz, Deep Learning, Verarbeitung großer Datenmengen usw. Zahlreiche Bibliotheken wie scikit-learn, tensorflow, pytorch, numba, pandas, jupyter, numpy, matplotlib usw. sind mit diesem Paket verfügbar

Stacklos

Python für Nebenläufigkeit

Um die Geschwindigkeit jeder Implementierung zu testen, schreiben wir ein Programm, das 500-mal integrate_f mit einem N-Wert von 50.000 aufruft und die Ausführungszeit über mehrere Durchläufe aufzeichnet. Die folgende Tabelle zeigt die Benchmark-Ergebnisse :

Implementierung

Ausführungszeit (Sekunden)

Beschleunigung

CPython

9,25

CPython + Cython

0,21

44x

PyPy

0,57

16x

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X