Python vs Cpython


447

Quel est tout ce tapage sur Python et CPython (Jython, IronPython) , je ne comprends pas:

python.org mentionne que CPython est:

L'implémentation "traditionnelle" de Python (surnommée CPython)

encore une autre question Stack Overflow mentionne que:

CPython est l'interpréteur de code octet par défaut de Python, qui est écrit en C.

Honnêtement, je ne comprends pas ce que ces deux explications signifient pratiquement, mais ce que je pensais, c'est que si j'utilise CPython, cela signifie que lorsque j'exécute un exemple de code python, il le compile en langage C, puis l'exécute comme s'il s'agissait de C code

Alors, qu'est-ce que CPython exactement et comment diffère-t-il par rapport à Python et devrais-je probablement utiliser CPython sur Python et si oui, quels sont ses avantages?


1
Article connexe - Y a
RBT

Réponses:


689

Alors, qu'est-ce que CPython?

CPython est l' implémentation Python d' origine . Il s'agit de l'implémentation que vous téléchargez sur Python.org. Les gens l'appellent CPython pour le distinguer des autres implémentations Python ultérieures et pour distinguer l'implémentation du moteur de langage du langage de programmation Python lui-même.

La dernière partie est d'où vient votre confusion; vous devez garder Python-the-language séparé de tout ce qui exécute le code Python.

CPython se trouve être implémenté en C. C'est juste un détail d'implémentation, vraiment. CPython compile votre code Python en bytecode (de manière transparente) et interprète ce bytecode dans une boucle d'évaluation.

CPython est également le premier à implémenter de nouvelles fonctionnalités; Le développement du langage Python utilise CPython comme base; d'autres implémentations suivent.

Qu'en est-il de Jython, etc.?

Jython , IronPython et PyPy sont les "autres" implémentations actuelles du langage de programmation Python; ceux-ci sont implémentés en Java, C # et RPython (un sous-ensemble de Python), respectivement. Jython compile votre code Python en bytecode Java , afin que votre code Python puisse s'exécuter sur la JVM. IronPython vous permet d'exécuter Python sur le Microsoft CLR . Et PyPy, mis en œuvre dans (un sous-ensemble de) Python, vous permet d'exécuter du code Python plus rapidement que CPython, ce qui devrait à juste titre vous épater. :-)

Compilation actuelle en C

Donc CPython ne traduit pas votre code Python en C par lui-même. Au lieu de cela, il exécute une boucle d'interpréteur. Il est un projet qui fait traduire le code Python-ish à C, et que l' on appelle Cython . Cython ajoute quelques extensions au langage Python et vous permet de compiler votre code en extensions C, code qui se connecte à l'interpréteur CPython.


93
Je pense qu'il vaut la peine de mentionner qu'en théorie, un script python pourrait être exécuté à l'aide de n'importe quelle implémentation, et les résultats de l'exécution du script devraient être les mêmes.
Douglas Mendizábal

3
En fait, et selon le projet sur lequel vous travaillez, ce peut être une bonne idée de tester et de profiler votre code Python sur plusieurs implémentations. Après avoir travaillé sur des projets Java + Jython auparavant, vous pouvez rencontrer de nombreuses surprises car les développeurs n'ont pas suffisamment testé leurs bibliothèques sur cette plate-forme.
rahmu

9
Dire que "PyPy est plus rapide que CPython" est un peu dangereux je dirais. Il y a une très bonne réponse à cette question ici: stackoverflow.com/questions/18946662/…
Max Leske

Je suis excité par IronPython ... jusqu'à ce que je constate qu'il ne prend en charge que Python 2.x.
Sean Anderson

@SeanAnderson: Il en va de même pour Jython (jusqu'en 2015, la version officielle n'était compatible qu'avec la version 2.5, ce qui la rend obsolète depuis neuf ans; ils ont finalement obtenu une version 2.7 en 2015, mais toujours aucun signe d'une version 3.x).
ShadowRanger

90

Vous devez faire la distinction entre une langue et une implémentation. Python est un langage,

Selon Wikipedia , "Un langage de programmation est une notation pour écrire des programmes, qui sont des spécifications d'un calcul ou d'un algorithme". Cela signifie que ce sont simplement les règles et la syntaxe pour écrire du code. Séparément, nous avons une implémentation de langage de programmation qui, dans la plupart des cas, est l'interpréteur ou le compilateur réel.

Python est un langage. CPython est l'implémentation de Python en C. Jython est l'implémentation en Java, etc.

Pour résumer: vous utilisez déjà CPython (si vous avez téléchargé ici ).


2
Vous devriez lire le post de Martijn Pieters "CPython ne traduit pas votre code Python en C par lui-même. Il exécute à la place une boucle d'interpréteur. Il existe un projet qui traduit le code Python-ish en C, et qui s'appelle Cython"
Raymond Chenon

2
pourquoi il y a tant d'imphasisation sur Cpython. c'est à dire: on n'entend pas Cc ++ ou CJava ou même CSwift. Ou est-ce que je manque quelque chose?
Suhaib

3
@Suhaib: ils le font, dans le monde Java, les gens ont par exemple HotSpot, OpenJDK, IBM J9 JDK, Azul. Ils sont généralement plus précis, c'est-à-dire que vous ne voyez pas vraiment "installer Java" mais plutôt "installer un JDK Java 8 compatible, par exemple Oracle JDK 8". Dans le monde JavaScript, vous avez node.js, V8, etc. Vous "installez node.js", pas "installez JavaScript", non? Mais dans le monde Python, il est assez courant de simplement dire "installer Python 3.6" et c'est fait, en se référant à une spécification de langue, pas à un runtime spécifique.
Hendy Irawan

37

Même moi, j'ai eu le même problème à comprendre en quoi CPython, JPython, IronPython, PyPy sont différents les uns des autres.

Donc, je suis prêt à effacer trois choses avant de commencer à expliquer:

  1. Python : C'est un langage, il indique / décrit uniquement comment vous transmettre / vous exprimer à l'interpréteur (le programme qui accepte votre code python).
  2. Mise en œuvre : tout dépend de la façon dont l'interprète a été écrit, en particulier dans quelle langue et ce qu'il finit par faire .
  3. Bytecode : C'est le code qui est traité par un programme, généralement appelé machine virtuelle, plutôt que par la "vraie" machine informatique, le processeur matériel.

CPython est l'implémentation, qui a été écrite en langage C. Il finit par produire du bytecode (jeu d'instructions basé sur la pile) qui est spécifique à Python, puis l'exécute. La raison pour convertir du code Python en un bytecode est parce qu'il est plus facile d'implémenter un interpréteur s'il ressemble à des instructions machine. Mais, il n'est pas nécessaire de produire du bytecode avant l'exécution du code Python (mais CPython le produit).

Si vous souhaitez consulter le bytecode de CPython, vous pouvez le faire. Voici comment vous pouvez:

>>> 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

Voyons maintenant le code ci-dessus. Les lignes 1 à 6 sont une définition de fonction. À la ligne 8, nous importons le module 'dis' qui peut être utilisé pour afficher le bytecode Python intermédiaire (ou vous pouvez dire, le désassembleur pour le bytecode Python) généré par CPython (interprète).

REMARQUE : j'ai obtenu le lien vers ce code à partir du canal IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Et puis, il y a Jython, qui est écrit en Java et finit par produire du code d'octet Java. Le code d'octet Java s'exécute sur Java Runtime Environment, qui est une implémentation de Java Virtual Machine (JVM). Si cela prête à confusion, je soupçonne que vous n'avez aucune idée du fonctionnement de Java. En termes simples, le code Java (le langage, pas le compilateur) est pris par le compilateur Java et génère un fichier (qui est du code d'octet Java) qui peut être exécuté uniquement à l'aide d'un JRE. Ceci est fait de sorte qu'une fois le code Java compilé, il puisse être porté sur d'autres machines au format de code octet Java, qui ne peut être exécuté que par JRE. Si cela prête toujours à confusion, vous voudrez peut-être consulter cette page Web .

Ici, vous pouvez demander si le bytecode de CPython est portable comme Jython, je ne le pense pas. Le bytecode produit dans l'implémentation de CPython était spécifique à cet interpréteur pour le rendre facile pour une exécution ultérieure du code (je soupçonne également que, une telle production de bytecode intermédiaire, juste pour la facilité du traitement se fait dans de nombreux autres interprètes).

Ainsi, en Jython, lorsque vous compilez votre code Python, vous vous retrouvez avec du code d'octet Java, qui peut être exécuté sur une machine virtuelle Java.

De même, IronPython (écrit en langage C #) compile votre code Python en Common Language Runtime (CLR), qui est une technologie similaire à celle de JVM, développée par Microsoft.


3
merci pour une explication détaillée !! Cela signifie que CPython s'occupe de convertir le code Python en code octet et d'interpréter également le code octet en code machine? En coquille de noix CPython est le compilateur (pour Python en code octet) et la machine virtuelle Python (pour le code octet en code machine)? Par comparaison à .Net, il existe un compilateur C # pour convertir C # en MSIL et CLR pour convertir de MSIL en code machine.
rahulaga_dev

30

Cet article explique en détail la différence entre les différentes implémentations de Python. Comme le dit l'article:

La première chose à réaliser est que «Python» est une interface. Il y a une spécification de ce que Python doit faire et comment il doit se comporter (comme avec n'importe quelle interface). Et il existe plusieurs implémentations (comme avec n'importe quelle interface).

La deuxième chose à réaliser est que «interprété» et «compilé» sont des propriétés d'une implémentation, pas une interface.


20

Python est un langage: un ensemble de règles qui peuvent être utilisées pour écrire des programmes. Il existe plusieurs implémentations de ce langage.

Quelle que soit l'implémentation que vous prenez, ils font à peu près la même chose: prenez le texte de votre programme et interprétez-le, exécutant ses instructions. Aucun d'eux ne compile votre code en C ou dans un autre langage.

CPython est l'implémentation d'origine, écrite en C. (La partie "C" de "CPython" fait référence au langage qui a été utilisé pour écrire l'interpréteur Python lui-même.)

Jython est le même langage (Python), mais implémenté à l'aide de Java.

L'interprète IronPython a été écrit en C #.

Il y a aussi PyPy - un interpréteur Python écrit en Python. Faites votre choix :)


8

implementationsignifie quel langage a été utilisé pour implémenter Python et non comment le code python serait implémenté. L'avantage d'utiliser CPython est la disponibilité de C Run-time ainsi qu'une intégration facile avec C / C ++.

Donc, CPython a été initialement implémenté à l'aide de C. Il y avait d'autres fourches dans l'implémentation d'origine qui permettaient à Python de lever Java (JYthon) ou .NET Runtime (IronPython).

En fonction de l'implémentation que vous utilisez, la disponibilité de la bibliothèque peut varier, par exemple Ctypes n'est pas disponible dans Jython , donc toute bibliothèque qui utilise ctypes ne fonctionnerait pas dans Jython. De même, si vous souhaitez utiliser une classe Java, vous ne pouvez pas le faire directement depuis CPython. Vous avez besoin soit d'une colle (JEPP), soit de Jython (The Java Implementation of Python)


4

Vous devez savoir que CPython ne prend pas vraiment en charge le multithreading en raison du verrouillage de l'interpréteur global . Il n'a également aucun mécanisme d'optimisation pour la récursivité et a de nombreuses autres limitations que d'autres implémentations et bibliothèques essaient de combler.

Vous devriez jeter un œil à cette page sur le wiki python.

Regardez les extraits de code sur cette page, cela vous donnera une bonne idée de ce qu'est un interprète.


17
CPython prend en charge le multithreading, mais le GIL rend difficile l'exploitation de plusieurs cœurs ou processeurs. Ce n'est pas tout à fait la même chose que de ne pas prendre en charge le multithreading.
Martijn Pieters

0

L'implémentation originale et standard de Python est généralement appelée CPythonlorsque vous souhaitez la comparer avec les autres options ( et simplement «Python» dans le cas contraire ). Ce nom vient du fait qu'il est codé en portable ANSI C language code. Il s'agit du Python que vous récupérez sur http://www.python.org , que vous obtenez avec les distributions ActivePython et Enthought , et que vous avez automatiquement sur la plupart des machines Linux et Mac OS X. Si vous avez trouvé une version préinstallée de Python sur votre machine, c'est probablement CPython, sauf si votre entreprise ou organisation utilise Python de manière plus spécialisée.

À moins que vous ne vouliez créer un script Javaou des .NETapplications avec Python ou que vous ne trouviez les avantages Stacklessou les avantages PyPy, vous souhaiterez probablement utiliser le CPythonsystème standard . Parce qu'il s'agit de l'implémentation de référence du langage, il a tendance à fonctionner le plus rapidement, à être le plus complet et à être plus à jour et plus robuste que les systèmes alternatifs.


3
Je ne veux pas être impoli, mais CPython ne fonctionne absolument pas le plus rapidement.
Myles Hollowed

0

Une implémentation de langage de programmation est un système pour exécuter des programmes informatiques.

Il existe deux approches générales pour l'implémentation d'un langage de programmation:

  • Interprétation : Un interprète prend en entrée un programme dans une langue et exécute les actions écrites dans cette langue sur une machine.
  • Compilation : Un compilateur prend en entrée un programme dans une langue et traduit ce programme dans une autre langue, qui peut servir d'entrée à un autre interprète ou à un autre compilateur.

Python est un langage de programmation de haut niveau interprété créé par Guido van Rossum en 1991.

CPython est une version de référence du langage informatique Python, qui est également écrit en C créé par Guido van Rossum .

Autre liste d'implémentations Python

La source

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.