8 puntos por GN⁺ 2024-01-10 | 1 comentarios | Compartir por WhatsApp

Se agrega un compilador JIT a Python 3.13

  • Brandt Bucher, desarrollador principal de CPython, presentó un pull request para agregar un compilador JIT a la rama de Python 3.13.
  • Este cambio será una de las transformaciones más grandes del intérprete de CPython desde el intérprete adaptativo especializado añadido en Python 3.11.

¿Qué es JIT?

  • La compilación JIT (Just in Time) se refiere a un diseño en el que la compilación ocurre cuando el código se ejecuta por primera vez.
  • Un compilador JIT es un compilador que genera código máquina, en contraste con un compilador AOT (Ahead of Time).
  • El código de Python primero se compila a bytecode, y ese bytecode no significa nada para la CPU por sí mismo, sino que se ejecuta mediante un bucle especial de intérprete de bytecode.

¿Qué es copy-and-patch JIT?

  • copy-and-patch JIT es un concepto propuesto en 2021, diseñado como un algoritmo rápido para runtimes de lenguajes dinámicos.
  • copy-and-patch JIT se basa en la idea de copiar las instrucciones de cada operación y rellenar (parchear) los argumentos del bytecode.

Ventajas y desventajas de copy-and-patch JIT

  • Mientras que un compilador JIT “completo” compila bytecode de alto nivel a instrucciones de bajo nivel en un lenguaje intermedio (IL), copy-and-patch JIT realiza la compilación de bytecode a código máquina mediante un conjunto de plantillas.
  • copy-and-patch JIT no necesita ejecutar una arquitectura compleja de compilador JIT dentro del runtime de Python; basta con instalar las herramientas JIT de LLVM en la máquina donde se compila CPython desde el código fuente.

¿Cómo funciona este JIT?

  • Se amplía una API recién agregada a Python 3.13 para permitir que optimizadores conectables puedan descubrirse en tiempo de ejecución.
  • El nuevo JIT es un optimizador opcional para esta nueva arquitectura.
  • Al compilar CPython desde el código fuente, si se proporciona la bandera --enable-experimental-jit, se generan plantillas de código máquina para el bytecode de Python.

¿Este JIT es más rápido?

  • Los benchmarks iniciales muestran mejoras de rendimiento de alrededor de 2-9%.
  • Este JIT es la piedra angular de una serie de optimizaciones que pueden mejorar significativamente el rendimiento de Python.

Opinión de GN⁺

  • El compilador JIT añadido a Python 3.13 es un cambio importante para mejorar la velocidad de ejecución de Python, especialmente al aumentar la eficiencia en tareas repetitivas.
  • copy-and-patch JIT ofrece un enfoque innovador para mejorar el rendimiento sin necesidad de integrar una arquitectura JIT compleja en el runtime de Python del usuario.
  • Se espera que esta tecnología genere debates interesantes en la comunidad de Python y abra nuevas puertas para la optimización del rendimiento de Python.

1 comentarios

 
GN⁺ 2024-01-10
Opiniones de Hacker News
  • Es interesante ver una mejora de rendimiento del 2-9% entre versiones de software. A veces estas pequeñas mejoras se consideran decepcionantes, pero prefiero que se acumulen de forma constante y que cada versión sea más rápida que la anterior.
  • Es genial ver que la técnica de "copiar y parchear" de Haoran Xu y Fredrik Kjolstad esté recibiendo atención. La conocí por primera vez a través de una publicación del blog sobre el proyecto de remake de LuaJIT de Xu. Me pareció muy ingeniosa la forma de reutilizar tecnologías existentes para crear algo nuevo. Recomiendo esa publicación a quienes quieran aprender sobre implementación de lenguajes. Además, Xu explica que la razón por la que tardó en actualizar el blog fue una reelaboración del backend.
  • Brandt presentó sobre este tema en el sprint de desarrolladores core de CPython del año pasado.
  • A pesar del trabajo en PyPy, Jython, GraalPy e IronPython, la incorporación de un JIT a CPython se considera un avance importante para el ecosistema de Python. Sobre todo, genera expectativa la evolución posterior a la versión 3.13.
  • Uso Python para todo excepto desarrollo web, así que cualquier mejora de rendimiento es muy positiva. El ecosistema de Python se ha alejado de las solicitudes sin estado como CGI o mod_php y se ha movido hacia procesos de larga ejecución. ¿Eso significa que hay que reiniciar la aplicación local cada vez que se cambia algo en una aplicación web? Algunos desarrolladores usan métodos para reiniciar automáticamente la aplicación al guardar un archivo.
  • Recuerdo que se suponía que CPython mantendría la base de código muy simple y que las optimizaciones quedarían a cargo de otras implementaciones.
  • El artículo presenta el JIT de "copiar y parchear" como algo nuevo, pero recuerdo que el QuickBASIC de DOS usaba un enfoque parecido. QuickBASIC parcheaba bloques de ensamblador plantilla en memoria y generaba código ensamblador muy malo.
  • El progreso en el rendimiento de Python en los últimos 2 años es sorprendente. El equipo central se ha tomado en serio la mejora del rendimiento como objetivo y ha logrado avances visibles.
  • Ojalá se invirtiera dinero en PyPy. Pero PyPy no ofrece un tiempo de arranque especialmente bueno en programas pequeños, así que no se obtiene una gran ventaja. Además, en programas grandes pueden surgir problemas complejos de compatibilidad. Si el JIT de CPython resulta más confiable o tiene un arranque más rápido, podría resolver parte de esos problemas.
  • Es ingenioso el mensaje del PR en el repositorio de GitHub de Python que parodia "La noche antes de Navidad".