Python, uno de los lenguajes de programación más populares, requiere un intérprete para ejecutar las instrucciones definidas por el código de Python.
A diferencia de otros lenguajes que se compilan directamente en código de máquina, Python depende del intérprete para leer el código y traducir sus instrucciones para que la CPU realice las acciones relacionadas.
Hay varios intérpretes y en este artículo, vamos a dar un vistazo a algunos de ellos.
Cuando se habla de un intérprete de Python, generalmente se hace referencia al binario
/usr/bin/python
. Eso te permite ejecutar un archivo
.py
.
Sin embargo, la interpretación es sólo una tarea más. Antes de que una línea de código de Python se ejecute realmente en la CPU, se requieren estos cuatro pasos:
- Léxico : El código fuente hecho por humanos se convierte en una secuencia de entidades lógicas, los llamados tokens léxicos.
- Análisis: En el analizador, los tokens léxicos se verifican con respecto a la sintaxis y la gramática. La salida del analizador es un árbol de sintaxis abstracta (AST).
- Compilación: En función del AST, el compilador crea el código de bytes de Python. El bytecode consta de instrucciones muy básicas independientes de la plataforma.
- Interpretación: El intérprete toma el código de bytes y realiza las operaciones especificadas.
Como puedes ver, se requieren muchos pasos antes de tomar cualquier acción real. Por ello, tiene sentido echar un vistazo a los diferentes intérpretes.
1. CPython
es la implementación de referencia de Python y la predeterminada en muchos sistemas.
Como sugiere su propio nombre, CPython está escrito en C.
Como resultado, es posible escribir extensiones en C y por lo tanto, hacer que el código de la biblioteca basado en C -ampliamente utilizado- esté disponible en Python.
CPython está disponible en una amplia gama de plataformas, incluidas ARM, iOS y RISC.
Sin embargo, como implementación de referencia del lenguaje, CPython está cuidadosamente optimizado y no se centra en la velocidad.
2. Pyston
es una bifurcación del intérprete CPython que implementa optimizaciones de rendimiento.
El proyecto se describe a sí mismo como un reemplazo del intérprete estándar de CPython para grandes aplicaciones del mundo real con un potencial de aceleración de hasta el 30 %.
Debido a la falta de paquetes binarios compatibles, los paquetes de Pyston deben volver a compilarse durante el proceso de descarga.
3. PyPy
es un compilador Just-in-time (JIT) para Python que está escrito en RPython, un subconjunto de Python tipificado estáticamente.
A diferencia del intérprete de CPython, PyPy compila en código de máquina que la CPU puede ejecutar directamente.
PyPy es el patio de recreo para los desarrolladores de Python donde pueden experimentar con nuevas funciones más fácilmente.
PyPy es más rápido que la implementación de referencia de CPython.
Debido a la naturaleza del compilador JIT, solo las aplicaciones que se han estado ejecutando durante mucho tiempo se benefician del almacenamiento en caché.
PyPy puede actuar como reemplazo de CPython. Sin embargo, hay un inconveniente.
La mayoría de los módulos de extensión C son compatibles, pero se ejecutan más lentamente que uno de Python.
Los módulos de extensión PyPy están escritos en Python (no C) y por lo tanto, el compilador JIT puede optimizarlos, mientras su aplicación no dependa de módulos incompatibles.
PyPy es un excelente reemplazo para CPython, hay una página dedicada en el sitio web del proyecto que describe las diferencias con CPython al detalle.
4. RustPython
Como sugiere su propio nombre, RustPython es un intérprete de Python escrito en Rust.
Aunque el lenguaje de programación Rust es bastante nuevo, ha ido ganando popularidad y es candidato a ser el sucesor de C y C++.
Por defecto, RustPython se comporta como el intérprete de CPython pero también tiene un compilador JIT que se puede habilitar opcionalmente.
Otra buena característica es que la cadena de herramientas de Rust permite compilar directamente en WebAssembly y también permite ejecutar el intérprete completamente en el navegador.
Se puede encontrar una demostración en el repositorio de Github, rustpython.github.com/demo, del propio proyecto.
5. Stackless Python
se describe a sí mismo como una versión mejorada del lenguaje de programación Python.
El proyecto es básicamente una bifurcación del intérprete CPython que agrega microhilos, canales y un programador al lenguaje.
Los microhilos permiten estructurar tu código en tasklets que permiten ejecutar código en paralelo. Este enfoque es comparable al uso de subprocesos verdes del módulo greenlet.
Los canales se pueden utilizar para la comunicación bidireccional entre tasklets, un proyecto conocido de Stackless Python es el juego MMORPG Eve Online.
6. Micro Python
es el camino a seguir si apuntas a los microcontroladores. Es una implementación sencilla que solo requiere 16kB de RAM y 256kB de espacio.
Debido al entorno integrado al que está destinada, la biblioteca estándar de MicroPython es solo un subconjunto de la extensa STL de CPython.
Para desarrollar y probar o como una alternativa liviana, MicroPython también se ejecuta en máquinas x86 y x64 ordinarias.
MicroPython está disponible para Linux, Windows y muchos microcontroladores.
¿Qué intérprete es mejor?
Por diseño, Python es un lenguaje intrínsecamente lento. Dependiendo de la tarea, existen diferencias de desempeño significativas entre los intérpretes que se utilicen.
Si quieres obtener una descripción general de qué intérprete es la mejor elección para una determinada tarea, puedes consultar pybenchmarks.org .
Una alternativa al uso de un intérprete es compilar el código binario de Python directamente en el código de la máquina. Nuitka, por ejemplo, es uno de esos proyectos capaces de compilar código Python a código C y de C a código máquina.
Luego, el código C se compila en código de máquina utilizando un compilador de C ordinario.
Conclusión final
Python es un lenguaje maravilloso para la creación rápida de prototipos y la automatización de tareas. Además, es fácil de aprender y muy adecuado para principiantes.
Si suele utilizar CPython, puede ser interesante ver cómo se comporta tu código en otros intérpretes.
Si usas Fedora, puedes probar fácilmente algunos otros intérpretes ya que el administrador de paquetes ya proporciona los archivos binarios correctos para ello.
Consulta fedora.developer.org si quieres obtener más información.