Python gegen Cpython

447

Was ist das für eine Aufregung um Python und CPython (Jython, IronPython) ? , ich verstehe es nicht:

python.org erwähnt, dass CPython ist:

Die "traditionelle" Implementierung von Python (Spitzname CPython)

In einer weiteren Frage zum Stapelüberlauf wird Folgendes erwähnt:

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

Ehrlich gesagt verstehe ich nicht, was diese beiden Erklärungen praktisch bedeuten, aber ich dachte, wenn ich CPython verwende, bedeutet dies, dass beim Ausführen eines Python-Beispielcodes dieser in die Sprache C kompiliert und dann ausgeführt wird, als wäre es C. Code

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

K DawG
quelle
1
In Verbindung stehender Beitrag - Gibt es einen Unterschied zwischen cpython und python
RBT

Antworten:

688

Was ist CPython?

CPython ist die ursprüngliche Python-Implementierung. Dies 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 der Sprach-Engine von der Python- Programmiersprache zu unterscheiden selbst zu unterscheiden.

Der letzte Teil ist, woher Ihre Verwirrung kommt; Sie müssen aus Python-der-Sprache getrennt zu halten , was auch immer läuft den Python - Code.

CPython ist zufällig in C implementiert. Das ist eigentlich nur ein Implementierungsdetail. CPython kompiliert Ihren Python-Code in Bytecode (transparent) und interpretiert diesen Bytecode in einer Auswertungsschleife.

CPython ist auch das erste Unternehmen, das neue Funktionen implementiert. Die Python-the-Language-Entwicklung verwendet CPython als Basis. Weitere Implementierungen folgen.

Was ist mit Jython usw.?

Jython , IronPython und PyPy sind die aktuellen "anderen" Implementierungen der Programmiersprache Python. Diese sind in Java, C # und RPython (eine Teilmenge von Python) implementiert. Jython kompiliert Ihren Python-Code in Java- Bytecode, damit Ihr Python-Code auf der JVM ausgeführt werden kann. Mit IronPython können Sie Python auf der Microsoft CLR ausführen . Mit PyPy, das in (einer Teilmenge von) Python implementiert ist, können Sie Python-Code schneller als CPython ausführen, was Sie zu Recht umhauen sollte. :-)

Eigentlich kompilieren zu C.

CPython übersetzt Ihren Python-Code also nicht selbst nach C. Stattdessen wird eine Interpreter-Schleife ausgeführt. Es gibt ein Projekt, das Python-Code in C übersetzt und Cython heißt . Cython fügt der Python-Sprache einige Erweiterungen hinzu und ermöglicht es Ihnen, Ihren Code in C-Erweiterungen zu kompilieren, Code, der in den CPython-Interpreter integriert wird.

Martijn Pieters
quelle
92
Ich denke, es ist erwähnenswert, dass theoretisch ein Python-Skript mit jeder der Implementierungen ausgeführt werden kann und die Ergebnisse der Ausführung des Skripts dieselben sein sollten.
Douglas Mendizábal
3
In der Tat und abhängig von dem Projekt, an dem Sie arbeiten, kann es eine gute Idee sein, Ihren Python-Code auf mehreren Implementierungen zu testen und zu profilieren. Nachdem Sie zuvor an Java + Jython-Projekten gearbeitet haben, können Sie auf viele Überraschungen stoßen, da Entwickler ihre Bibliotheken auf dieser Plattform nicht ausreichend getestet haben.
Rahmu
9
Zu sagen, dass "PyPy schneller als CPython ist", ist ein bisschen gefährlich, würde ich sagen. Genau auf diese Frage gibt es hier eine sehr gute Antwort: stackoverflow.com/questions/18946662/…
Max Leske
Ich war begeistert von IronPython ... bis ich sah, dass es nur Python 2.x unterstützt.
Sean Anderson
@ SeanAnderson: Gleiches gilt für Jython (bis 2015 war die offizielle Veröffentlichung nur 2,5-kompatibel, was sie neun Jahre veraltet machte; sie haben 2015 endlich eine Version 2.7 herausgebracht, aber immer noch keine Anzeichen für eine 3.x-Veröffentlichung).
ShadowRanger
89

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". Dies bedeutet, dass es einfach die Regeln und die Syntax zum Schreiben von Code sind. Separat haben wir eine Programmiersprachenimplementierung die in den meisten Fällen der eigentliche Interpreter oder Compiler 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 CPython bereits (wenn Sie von hier heruntergeladen haben ).

Jamylak
quelle
2
Sie sollten Martijn Pieters 'Beitrag "CPython übersetzt Ihren Python-Code nicht selbst in C. Es wird stattdessen eine Interpreter-Schleife ausgeführt. Es gibt ein Projekt, das Python-Code in C übersetzt und das heißt Cython"
Raymond
2
warum es so viel Imphasisierung über Cpython gibt. dh wir hören weder Cc ++ oder CJava noch CSwift. Oder fehlt mir etwas?
Suhaib
3
@Suhaib: In der Java-Welt haben die Leute zB HotSpot, OpenJDK, IBM J9 JDK, Azul. Sie sind normalerweise präziser, dh Sie sehen nicht wirklich "Java installieren", sondern "Installieren eines kompatiblen Java 8 JDK, zum Beispiel Oracle JDK 8". In der JavaScript-Welt haben Sie node.js, V8 usw. Sie "installieren node.js", nicht "JavaScript installieren", oder? Aber in der Python-Welt ist es ziemlich üblich, einfach "Python 3.6 installieren" zu sagen und fertig, unter Bezugnahme auf eine Sprachspezifikation, nicht auf eine bestimmte Laufzeit.
Hendy Irawan
37

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

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

  1. Python : Es ist eine Sprache, die nur angibt / beschreibt, wie Sie sich dem Interpreter (dem Programm, das Ihren Python-Code akzeptiert) vermitteln / ausdrücken können.
  2. Implementierung : Es geht darum, wie der Dolmetscher geschrieben wurde, insbesondere in welcher Sprache und was er letztendlich tut .
  3. Bytecode : Dies ist der Code, der von einem Programm verarbeitet wird, das normalerweise als virtuelle Maschine bezeichnet wird, und nicht von der "realen" Computermaschine, dem Hardwareprozessor.

CPython ist die Implementierung, die in C-Sprache geschrieben wurde. Am Ende wird Bytecode (stapelmaschinenbasierter Befehlssatz) erzeugt, der Python-spezifisch ist, und dann ausgeführt. Der Grund für die Konvertierung von Python-Code in einen Bytecode liegt darin, dass es einfacher ist, einen Interpreter zu implementieren, wenn er wie Maschinenanweisungen aussieht. Es ist jedoch nicht erforderlich, vor der Ausführung des Python-Codes einen Bytecode zu erstellen (CPython erzeugt jedoch).

Wenn Sie sich den Bytecode von CPython ansehen möchten, können Sie dies tun. So können Sie:

>>> def f(x, y):                # line 1
...    print("Hello")           # line 2
...    if x:                    # line 3
...       y += x                # line 4
...    print(x, y)              # line 5
...    return x+y               # line 6
...                             # line 7
>>> import dis                  # line 8
>>> dis.dis(f)                  # line 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

Schauen wir uns nun den obigen Code an. Die Zeilen 1 bis 6 sind eine Funktionsdefinition. In Zeile 8 importieren wir das 'dis'-Modul, mit dem der von CPython (Interpreter) generierte Python-Bytecode (oder Disassembler für Python-Bytecode) angezeigt werden kann.

HINWEIS : Ich habe den Link zu diesem Code vom # Python-IRC-Kanal erhalten: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Und dann gibt es Jython, das in Java geschrieben ist und am Ende Java-Bytecode erzeugt. Der Java-Bytecode wird in der Java Runtime Environment ausgeführt, einer Implementierung von Java Virtual Machine (JVM). Wenn dies verwirrend ist, vermute ich, dass Sie keine Ahnung haben, wie Java funktioniert. Für Laien wird Java-Code (die Sprache, nicht der Compiler) vom Java-Compiler verwendet und gibt eine Datei (Java-Bytecode) aus, die nur mit einer JRE ausgeführt werden kann. Dies geschieht, damit der Java-Code nach dem Kompilieren im Java-Bytecode-Format, das nur von JRE ausgeführt werden kann, auf andere Computer portiert werden kann. Wenn dies immer noch verwirrend ist, sollten Sie sich diese Webseite ansehen .

Hier können Sie fragen, ob der CPython-Bytecode wie Jython portabel ist, ich vermute nicht. Der in der CPython-Implementierung erzeugte Bytecode war spezifisch für diesen Interpreter, um die weitere Ausführung von Code zu vereinfachen (ich vermute auch, dass eine solche Zwischen-Bytecode-Produktion nur zur Erleichterung der Verarbeitung in vielen anderen Interpreten durchgeführt wird).

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

In ähnlicher Weise kompiliert IronPython (in C # -Sprache geschrieben) Ihren Python-Code in Common Language Runtime (CLR), eine ähnliche Technologie im Vergleich zu JVM, die von Microsoft entwickelt wurde.

Vijay Kumar
quelle
3
Danke für die ausführliche Erklärung !! Dies bedeutet, dass CPython sich um die Konvertierung von Python-Code in Byte-Code und die Interpretation von Byte-Code in Maschinencode kümmert. In der Nussschale ist CPython Compiler (für Python-zu-Byte-Code) und Python Virtual Machine (für Byte-Code zu Maschinencode)? Im Vergleich zu .Net gibt es einen C # -Compiler zum Konvertieren von C # in MSIL und eine CLR zum Konvertieren von MSIL in Maschinencode.
rahulaga_dev
30

In diesem Artikel wird der Unterschied zwischen verschiedenen Implementierungen von Python ausführlich erläutert. Wie der Artikel es ausdrückt:

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

Das zweite, was zu erkennen ist, ist, dass 'interpretiert' und 'kompiliert' Eigenschaften einer Implementierung sind, keine Schnittstelle.

Shaktimaan
quelle
20

Python ist eine Sprache: eine Reihe von Regeln, mit denen Programme geschrieben werden können. Es gibt verschiedene Implementierungen dieser Sprache.

Unabhängig davon, welche Implementierung Sie durchführen, machen sie fast dasselbe: Nehmen Sie den Text Ihres Programms, interpretieren Sie ihn und führen Sie die Anweisungen aus. Keiner von ihnen kompiliert Ihren Code in C oder einer anderen Sprache.

CPython ist die ursprüngliche Implementierung, die in C geschrieben wurde. (Der Teil "C" in "CPython" bezieht sich auf die Sprache, in der der Python-Interpreter selbst geschrieben wurde.)

Jython ist dieselbe Sprache (Python), wird jedoch mit Java implementiert.

Der IronPython-Interpreter wurde in C # geschrieben.

Es gibt auch PyPy - einen in Python geschriebenen Python-Interpreter. Treffen Sie Ihre Wahl :)

Orlenko
quelle
8

implementationbedeutet, welche Sprache zur Implementierung von Python verwendet wurde und nicht, wie Python-Code implementiert werden würde. Der Vorteil der Verwendung von CPython ist die Verfügbarkeit von C-Laufzeit sowie die einfache Integration in C / C ++.

CPython wurde also ursprünglich mit implementiert C . Es gab andere Gabeln in der ursprünglichen Implementierung, die es Python ermöglichten, Java (JYthon) oder .NET Runtime (IronPython) zu nutzen.

Je nachdem, welche Implementierung Sie verwenden, kann die Verfügbarkeit der Bibliothek variieren. Beispielsweise ist Ctypes in Jython nicht verfügbar , sodass eine Bibliothek, die ctypes verwendet, in Jython nicht funktioniert. Wenn Sie eine Java-Klasse verwenden möchten, können Sie dies nicht direkt über CPython tun. Sie benötigen entweder einen Kleber (JEPP) oder Jython (Die Java-Implementierung von Python).

Abhijit
quelle
4

Sie sollten wissen, dass CPython Multithreading aufgrund der globalen Interpreter-Sperre nicht wirklich unterstützt . Es gibt auch keine Optimierungsmechanismen für die Rekursion und viele andere Einschränkungen, die andere Implementierungen und Bibliotheken zu füllen versuchen.

Sie sollten sich diese Seite ansehen im Python-Wiki .

Schauen Sie sich die Codefragmente auf dieser Seite an. Sie erhalten eine gute Vorstellung davon, was ein Interpreter ist.

Oussama L.
quelle
17
CPython unterstützt Multithreading, aber die GIL macht es schwierig, mehrere Kerne oder CPUs zu nutzen. Das ist nicht ganz das Gleiche, als würde man Multithreading überhaupt nicht unterstützen.
Martijn Pieters
0

Die ursprüngliche und standardmäßige Implementierung von Python wird normalerweise aufgerufen, CPythonwenn Sie sie den anderen Optionen gegenüberstellen möchten ( und ansonsten einfach nur „Python“ ). Dieser Name kommt von der Tatsache, dass es in tragbaren codiert ist ANSI C language code. Dies ist der Python, den Sie von http://www.python.org abrufen , mit den Distributionen ActivePython und Enthought abrufen und auf den meisten Linux- und Mac OS X-Computern automatisch verwenden. Wenn Sie auf Ihrem Computer eine vorinstallierte Version von Python gefunden haben, ist dies wahrscheinlich der Fall, es sei CPythondenn, Ihr Unternehmen oder Ihre Organisation verwendet Python auf speziellere Weise.

Sofern Sie keine Skripte Javaoder .NETAnwendungen mit Python erstellen oder die Vorteile von Stacklessoder PyPyüberzeugend finden möchten, möchten Sie wahrscheinlich das Standardsystem CPythonverwenden. Da es sich um die Referenzimplementierung der Sprache handelt, wird sie in der Regel am schnellsten ausgeführt, ist am vollständigsten und aktueller und robuster als die alternativen Systeme.

Sushant Chaudhary
quelle
3
Ich will nicht unhöflich sein, aber CPython läuft absolut nicht am schnellsten.
Myles Hollowed
0

Eine Programmiersprachenimplementierung ist ein System zum Ausführen von Computerprogrammen.

Es gibt zwei allgemeine Ansätze zur Implementierung der Programmiersprache:

  • Deutung : Ein Interpreter nimmt ein Programm in einer bestimmten Sprache als Eingabe und führt die in dieser Sprache geschriebenen Aktionen auf einem Computer aus.
  • Kompilierung : Ein Compiler verwendet ein Programm in einer bestimmten Sprache als Eingabe und übersetzt dieses Programm in eine andere Sprache, die als Eingabe für einen anderen Interpreter oder einen anderen Compiler dienen kann.

Python ist eine interpretierte Programmiersprache auf hoher Ebene, die 1991 von Guido van Rossum entwickelt wurde.

CPython ist eine Referenzversion der Python-Computersprache, die in C geschrieben ist und auch von Guido van Rossum erstellt wurde .

Andere Liste der Python-Implementierungen

Quelle

Premraj
quelle