CPython

Compartir Imprimir Citar

CPython es la implementación de referencia del lenguaje de programación Python. Escrito en C y Python, CPython es la implementación predeterminada y más utilizada del lenguaje Python.

CPython se puede definir como intérprete y compilador, ya que compila el código de Python en código de bytes antes de interpretarlo. Tiene una interfaz de función externa con varios idiomas, incluido C, en el que se deben escribir enlaces explícitamente en un idioma que no sea Python.

Diseño

Una característica particular de CPython es que utiliza un bloqueo de intérprete global (GIL) en cada proceso de interpretación de CPython, lo que significa que dentro de un solo proceso, solo un subproceso puede procesar el código de bytes de Python en un momento dado. Esto no significa que no tenga sentido utilizar subprocesos múltiples; el escenario de subprocesos múltiples más común es donde los subprocesos están en su mayoría esperando que se completen los procesos externos.

Esto puede suceder cuando varios subprocesos atienden a clientes separados. Un subproceso puede estar esperando que un cliente responda y otro puede estar esperando que se ejecute una consulta de la base de datos, mientras que el tercer subproceso en realidad está procesando el código de Python.

Sin embargo, el GIL significa que CPython no es adecuado para procesos que implementan algoritmos intensivos de CPU en código Python que potencialmente podrían distribuirse entre múltiples núcleos.

En aplicaciones del mundo real, las situaciones en las que el GIL es un cuello de botella importante son bastante raras. Esto se debe a que Python es un lenguaje intrínsecamente lento y, por lo general, no se usa para operaciones que requieren un uso intensivo de la CPU o sensibles al tiempo. Python generalmente se usa en el nivel superior y llama a funciones en bibliotecas para realizar tareas especializadas. Estas bibliotecas generalmente no están escritas en Python, y el código de Python en otro subproceso se puede ejecutar mientras se realiza una llamada a uno de estos procesos subyacentes. La biblioteca que no es de Python a la que se llama para realizar la tarea de uso intensivo de la CPU no está sujeta a la GIL y puede ejecutar simultáneamente muchos subprocesos en varios procesadores sin restricciones.

La concurrencia del código de Python solo se puede lograr con procesos de interpretación de CPython separados administrados por un sistema operativo multitarea. Esto complica la comunicación entre procesos de Python simultáneos, aunque el módulo de multiprocesamiento lo mitiga un poco; significa que las aplicaciones que realmente pueden beneficiarse de la ejecución simultánea de código Python se pueden implementar con una cantidad limitada de gastos generales.

La presencia de GIL simplifica la implementación de CPython y facilita la implementación de aplicaciones de subprocesos múltiples que no se benefician de la ejecución simultánea de código de Python. Sin embargo, sin una GIL, las aplicaciones de multiprocesamiento deben asegurarse de que todo el código común sea seguro para subprocesos.

Aunque se han hecho muchas propuestas para eliminar el GIL, el consenso general ha sido que, en la mayoría de los casos, las ventajas del GIL superan las desventajas; en los pocos casos en los que el GIL es un cuello de botella, la aplicación debe construirse en torno a la estructura de multiprocesamiento.

Historia

Golondrina descargada

Unladen Swallow era una rama de optimización de CPython, destinada a ser totalmente compatible y significativamente más rápida. Su objetivo era lograr sus objetivos complementando la máquina virtual personalizada de CPython con un compilador justo a tiempo creado con LLVM.

El proyecto había establecido el objetivo de una mejora de la velocidad por un factor de cinco sobre CPython; este objetivo no se cumplió.

El proyecto fue patrocinado por Google y los propietarios del proyecto, Thomas Wouters, Jeffrey Yasskin y Collin Winter, son empleados de Google a tiempo completo; sin embargo, la mayoría de los colaboradores del proyecto no eran empleados de Google. Unladen Swallow estaba alojado en Google Code.

Como muchas cosas relacionadas con el lenguaje Python, el nombre Unladen Swallow es una referencia a Monty Python, específicamente a la broma sobre la velocidad aerodinámica de las golondrinas sin carga en Monty Python and the Holy Grail.

Aunque no cumplió con todos los objetivos publicados, Unladen Swallow produjo un código que se agregó a la implementación principal de Python, como mejoras en el módulo cPickle.

En julio de 2010, algunos observadores especularon sobre si el proyecto estaba muerto o agonizante ya que aún no se había publicado el hito del cuarto trimestre de 2009. El tráfico en la lista de correo de Unladen disminuyó de 500 mensajes en enero de 2010 a menos de 10 en septiembre de 2010. También se informó que Unladen perdió la financiación de Google. En noviembre de 2010, uno de los principales desarrolladores anunció que "Jeffrey y yo hemos sido llamados a otros proyectos de mayor importancia para Google".

La rama de desarrollo del cuarto trimestre de 2009 se creó el 26 de enero de 2010, pero no se hizo publicidad en el sitio web. Además, con respecto a los planes a largo plazo, y dado que el proyecto perdió el lanzamiento de Python 2.7, se aceptó una Propuesta de mejora de Python (PEP), que proponía una fusión de Unladen Swallow en una rama especial py3k-jit del repositorio oficial de Python. A partir de julio de 2010, este trabajo estaba en curso. Esta fusión habría llevado algo de tiempo, ya que Unladen Swallow se basó originalmente en Python 2.6 con el que Python 3 rompió la compatibilidad (consulte Python 3000 para obtener más detalles). Sin embargo, el PEP fue posteriormente retirado.

A principios de 2011, quedó claro que el proyecto se detuvo.

Historial de liberaciones de golondrinas descargadas

Distribución

Las plataformas de nivel 1 compatibles oficialmente son Windows, Linux y macOS (y también Raspberry Pi OS y Linux para s390x en el nivel inferior).

Hay más plataformas que tienen implementaciones de trabajo que incluyen:similar a Unix

Especial e incrustado

Otro

PEP 11 enumera las plataformas que no son compatibles con CPython por Python Software Foundation. Estas plataformas aún pueden ser compatibles con puertos externos. Estos puertos incluyen:

Los puertos externos no integrados a la versión oficial de CPython de Python Software Foundation, con enlaces a su sitio de desarrollo principal, a menudo incluyen módulos adicionales para funcionalidades específicas de la plataforma, como API de gráficos y sonido para PSP y SMS y API de cámara para S60. Estos puertos incluyen:

Linux empresarial

Estas versiones de Python se distribuyen con las distribuciones empresariales de Linux compatibles actualmente. El estado de soporte de Python en la tabla se refiere al soporte del equipo central de Python, y no del mantenedor de la distribución.

Versión de distribuciónFin de vida de la distribuciónVersión de Python
Ubuntu 22.04 LTS (Medusa Jammy)3.10 [1]
Ubuntu 20.04 LTS (fosa focal)2030-043.8
Ubuntu 18.04 LTS (Castor biónico)2028-042.73.6
Ubuntu 16.04 LTS (Xenial Xerus)2021-04-302.73.5
Debian 112026-063.9
Debian 102024-062.73.7
Debian 92022-06-302.73.5
Red Hat Enterprise Linux 820292.73.6
Red Hat Enterprise Linux 72024-11-302.7
CentOS 82029-05-312.73.6
CentOS 72024-06-302.7
SUSE Linux Enterprise Server 152031-07-312.73.6
SUSE Linux Enterprise Server 122027-10-312.7
SUSE Linux Enterprise Server 112022-03-312.7
Versión antiguaVersión anterior, aún mantenidaUltima versión

Alternativas

CPython es una de varias implementaciones de Python de "calidad de producción" que incluyen: Jython, escrito en Java para la máquina virtual Java (JVM), PyPy, escrito en RPython y traducido a C, y IronPython, que está escrito en C# para el lenguaje común. Infraestructura. También hay varias implementaciones experimentales.