Python vs Cpython

447

¿Qué es todo este alboroto sobre Python y CPython (Jython, IronPython) ? No lo entiendo:

python.org menciona que CPython es:

La implementación "tradicional" de Python (apodado CPython)

otra pregunta de desbordamiento de pila menciona que:

CPython es el intérprete de código de bytes predeterminado de Python, que está escrito en C.

Honestamente, no entiendo qué significan prácticamente ambas explicaciones, pero lo que pensé fue que, si uso CPython, eso significa que cuando ejecuto un código python de muestra, lo compila en lenguaje C y luego lo ejecuta como si fuera C código

Entonces, ¿qué es exactamente CPython y cómo difiere en comparación con python? ¿Debería usar CPython sobre Python y, de ser así, cuáles son sus ventajas?

K DawG
fuente
1
Publicación
RBT

Respuestas:

689

Entonces, ¿qué es CPython?

CPython es la implementación original de Python. Es la implementación que descargas de Python.org. La gente lo llama CPython para distinguirlo de otras implementaciones posteriores de Python, y para distinguir la implementación del motor del lenguaje del lenguaje de programación Python .

La última parte es de donde viene tu confusión; necesita mantener Python-the-language separado de lo que sea que ejecute el código Python.

CPython pasa a ser implementado en C. Esto es sólo un detalle de implementación, la verdad. CPython compila su código Python en bytecode (de forma transparente) e interpreta ese bytecode en un bucle de evaluación.

CPython también es el primero en implementar nuevas características; El desarrollo de Python-the-language usa CPython como base; otras implementaciones siguen.

¿Qué hay de Jython, etc.?

Jython , IronPython y PyPy son las "otras" implementaciones actuales del lenguaje de programación Python; Estos se implementan en Java, C # y RPython (un subconjunto de Python), respectivamente. Jython compila su código Python en código de bytes Java , por lo que su código Python puede ejecutarse en la JVM. IronPython le permite ejecutar Python en Microsoft CLR . Y PyPy, que se implementa en (un subconjunto de) Python, le permite ejecutar código Python más rápido que CPython, lo que con razón debería sorprenderle. :-)

En realidad compilando a C

Entonces CPython no traduce su código Python a C por sí mismo. En cambio, ejecuta un bucle de intérprete. No es un proyecto que hace traducir el código Python-ish a C, y que se llama Cython . Cython agrega algunas extensiones al lenguaje Python y le permite compilar su código en extensiones C, código que se conecta al intérprete de CPython.

Martijn Pieters
fuente
93
Creo que vale la pena mencionar que, en teoría, un script de Python podría ejecutarse usando cualquiera de las implementaciones, y los resultados de ejecutar el script deberían ser los mismos.
Douglas Mendizábal
3
De hecho, y dependiendo del proyecto en el que esté trabajando, puede ser una buena idea probar y perfilar su código Python en varias implementaciones. Después de haber trabajado en proyectos Java + Jython antes, puede encontrarse con muchas sorpresas porque los desarrolladores no han probado sus bibliotecas lo suficiente en esta plataforma.
rahmu
99
Decir que "PyPy es más rápido que CPython" es un poco peligroso, diría yo. Aquí hay una muy buena respuesta a esa pregunta: stackoverflow.com/questions/18946662/…
Max Leske
Me entusiasmé con IronPython ... hasta que vi que solo es compatible con Python 2.x.
Sean Anderson el
@SeanAnderson: Lo mismo ocurre con Jython (hasta 2015, el lanzamiento oficial era solo compatible con 2.5, lo que lo hace nueve años desactualizado; finalmente obtuvieron un lanzamiento 2.7 en 2015, pero aún no hay señales de un lanzamiento 3.x).
ShadowRanger
90

Debe distinguir entre un idioma y una implementación. Python es un lenguaje

Según Wikipedia , "Un lenguaje de programación es una notación para escribir programas, que son especificaciones de un cálculo o algoritmo". Esto significa que son simplemente las reglas y la sintaxis para escribir código. Por separado, tenemos una implementación de lenguaje de programación que, en la mayoría de los casos, es el intérprete o compilador real.

Python es un lenguaje. CPython es la implementación de Python en C. Jython es la implementación en Java, y así sucesivamente.

En resumen: ya está utilizando CPython (si lo descargó desde aquí ).

jamylak
fuente
2
Debería leer la publicación de Martijn Pieters "CPython no traduce su código Python a C por sí mismo. En su lugar, ejecuta un bucle de intérprete. Hay un proyecto que traduce el código Python-ish a C, y se llama Cython"
Raymond Chenon
2
por qué hay tanta imphasization sobre Cpython. es decir: no escuchamos Cc ++ o CJava o incluso CSwift. O me estoy perdiendo algo ?
Suhaib
3
@Suhaib: lo hacen, en el mundo de Java la gente tiene, por ejemplo, HotSpot, OpenJDK, IBM J9 JDK, Azul. Por lo general, son más precisos, es decir, no se ve realmente "instalar Java" sino "instalar un Java 8 JDK compatible, por ejemplo, Oracle JDK 8". En el mundo de JavaScript tiene node.js, V8, etc. Usted "instala node.js", no "instala JavaScript", ¿verdad? Pero en el mundo de Python es bastante común decir "instalar Python 3.6" y listo, refiriéndose a una especificación de lenguaje, no a un tiempo de ejecución específico.
Hendy Irawan
37

Incluso tuve el mismo problema al entender cómo CPython, JPython, IronPython, PyPy son diferentes entre sí.

Entonces, estoy dispuesto a aclarar tres cosas antes de comenzar a explicar:

  1. Python : es un lenguaje, solo establece / describe cómo transmitir / expresarse al intérprete (el programa que acepta su código de Python).
  2. Implementación : Se trata de cómo se escribió el intérprete, específicamente, en qué idioma y qué termina haciendo .
  3. Bytecode : es el código que procesa un programa, generalmente denominado máquina virtual, en lugar de la máquina de computadora "real", el procesador de hardware.

CPython es la implementación, que fue escrita en lenguaje C. Termina produciendo bytecode (conjunto de instrucciones basado en máquina de pila) que es específico de Python y luego lo ejecuta. La razón para convertir el código de Python en un código de bytes es porque es más fácil implementar un intérprete si parece instrucciones de máquina. Pero, no es necesario producir algún bytecode antes de la ejecución del código Python (pero CPython produce).

Si desea ver el código de bytes de CPython, puede hacerlo. Así es como puedes:

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

Ahora, echemos un vistazo al código anterior. Las líneas 1 a 6 son una definición de función. En la línea 8, importamos el módulo 'dis' que se puede usar para ver el bytecode intermedio de Python (o se puede decir, desensamblador para el bytecode de Python) generado por CPython (intérprete).

NOTA : Obtuve el enlace a este código del canal #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Y luego, está Jython, que está escrito en Java y termina produciendo código de bytes Java. El código de bytes de Java se ejecuta en Java Runtime Environment, que es una implementación de Java Virtual Machine (JVM). Si esto es confuso, sospecho que no tienes idea de cómo funciona Java. En términos simples, el compilador de Java toma el código Java (el lenguaje, no el compilador) y genera un archivo (que es el código de bytes de Java) que solo se puede ejecutar utilizando un JRE. Esto se hace para que, una vez que se compila el código Java, se pueda portar a otras máquinas en formato de código de bytes Java, que solo puede ejecutar JRE. Si esto sigue siendo confuso, es posible que desee echar un vistazo a esta página web .

Aquí, puede preguntar si el código de bytes de CPython es portátil como Jython, sospecho que no. El bytecode producido en la implementación de CPython era específico de ese intérprete para facilitar la ejecución posterior del código (también sospecho que, tal producción de bytecode intermedio, solo por la facilidad de procesamiento en muchos otros intérpretes).

Entonces, en Jython, cuando compila su código Python, termina con un código de bytes Java, que puede ejecutarse en una JVM.

Del mismo modo, IronPython (escrito en lenguaje C #) compila su código Python en Common Language Runtime (CLR), que es una tecnología similar en comparación con JVM, desarrollada por Microsoft.

Vijay Kumar
fuente
3
Gracias por una explicación detallada! ¿Esto significa que CPython se encarga de convertir el código de Python a Byte Code y también interpreta el código de bytes a código de máquina? En la cáscara de nuez CPython es Compilador (para Python a Byte Code) y Python Virtual Machine (para Byte code a Machine code)? Comparando lo mismo con .Net, hay un compilador de C # para convertir C # a MSIL y CLR para convertir de MSIL a código de máquina.
rahulaga_dev
30

Este artículo explica a fondo la diferencia entre diferentes implementaciones de Python. Como dice el artículo:

Lo primero que debe darse cuenta es que 'Python' es una interfaz. Hay una especificación de lo que debe hacer Python y cómo debe comportarse (como con cualquier interfaz). Y hay múltiples implementaciones (como con cualquier interfaz).

La segunda cosa a tener en cuenta es que 'interpretado' y 'compilado' son propiedades de una implementación, no una interfaz.

shaktimaan
fuente
20

Python es un lenguaje: un conjunto de reglas que se pueden usar para escribir programas. Hay varias implementaciones de este lenguaje.

Independientemente de la implementación que realice, hacen casi lo mismo: toman el texto de su programa e lo interpretan, ejecutando sus instrucciones. Ninguno de ellos compila su código en C ni en ningún otro lenguaje.

CPython es la implementación original, escrita en C. (La parte "C" en "CPython" se refiere al lenguaje que se usó para escribir el propio intérprete de Python).

Jython es el mismo lenguaje (Python), pero implementado usando Java.

El intérprete IronPython fue escrito en C #.

También hay PyPy, un intérprete de Python escrito en Python. Haz tu elección :)

orlenko
fuente
8

implementationsignifica qué lenguaje se usó para implementar Python y no cómo se implementaría Python Code. La ventaja de usar CPython es la disponibilidad de C Run-time, así como la fácil integración con C / C ++.

Entonces CPython se implementó originalmente usando C. Hubo otros forks para la implementación original que permitieron a Python utilizar Java (JYthon) o .NET Runtime (IronPython).

Según la implementación que utilice, la disponibilidad de la biblioteca puede variar, por ejemplo, Ctypes no está disponible en Jython , por lo que cualquier biblioteca que use ctypes no funcionaría en Jython. Del mismo modo, si desea utilizar una clase Java, no puede hacerlo directamente desde CPython. Necesitas un pegamento (JEPP) o necesitas usar Jython (La implementación de Java de Python)

Abhijit
fuente
4

Debe saber que CPython realmente no admite subprocesos múltiples debido al bloqueo global del intérprete . Tampoco tiene mecanismos de optimización para la recursión, y tiene muchas otras limitaciones que otras implementaciones y bibliotecas intentan llenar.

Deberías echar un vistazo a esta página en el wiki de Python.

Mire los fragmentos de código en esta página, le dará una buena idea de lo que es un intérprete.

Oussama L.
fuente
17
CPython admite subprocesos múltiples, pero GIL hace que sea difícil aprovechar múltiples núcleos o CPU. Eso no es exactamente lo mismo que no admitir multithreading en absoluto.
Martijn Pieters
0

La implementación original y estándar de Python generalmente se llama CPythoncuando desea contrastarla con las otras opciones ( y simplemente "Python" de lo contrario ). Este nombre proviene del hecho de que está codificado en portátil ANSI C language code. Este es el Python que obtiene de http://www.python.org , obtiene con las distribuciones ActivePython y Enthought , y tiene automáticamente en la mayoría de las máquinas Linux y Mac OS X. Si ha encontrado una versión preinstalada de Python en su máquina, probablemente CPythonsea, a menos que su empresa u organización esté usando Python de formas más especializadas.

A menos que desee ejecutar secuencias de comandos Javao .NETaplicaciones con Python o encuentre los beneficios Stacklesso sea PyPyconvincente, probablemente desee utilizar el CPythonsistema estándar . Debido a que es la implementación de referencia del lenguaje, tiende a ejecutarse más rápido, ser el más completo y más actualizado y robusto que los sistemas alternativos.

Sushant Chaudhary
fuente
3
No pretendo ser grosero, pero CPython no corre absolutamente el más rápido.
Myles Hollowed
0

Una implementación de lenguaje de programación es un sistema para ejecutar programas de computadora.

Existen dos enfoques generales para la implementación del lenguaje de programación:

  • Interpretación : un intérprete toma como entrada un programa en algún idioma y realiza las acciones escritas en ese idioma en alguna máquina.
  • Compilación : un compilador toma como entrada un programa en algún idioma y traduce ese programa a otro idioma, que puede servir como entrada para otro intérprete u otro compilador.

Python es un lenguaje de programación de alto nivel interpretado creado por Guido van Rossum en 1991.

CPython es la versión de referencia del lenguaje informático Python, que está escrito en C creado por Guido van Rossum también.

Otra lista de implementaciones de Python

Fuente

Premraj
fuente