Python 3.13 obtiene un JIT
Python 3.13 incorpora un compilador JIT experimental de “copy-and-patch” que por ahora aporta mejoras modestas de 2–9%, pero se considera una base importante para futuras optimizaciones más grandes. Los comentaristas debaten hasta dónde se puede llevar realmente CPython frente a runtimes con mucho JIT como V8 o PyPy, dada la semántica altamente dinámica de Python, su dependencia de extensiones C y el deseo de preservar la compatibilidad del ecosistema. Muchos siguen viendo valiosas las mejoras incrementales, especialmente si se acumulan a lo largo de varias versiones, mientras que otros cuestionan si finalmente harán falta cambios más profundos o implementaciones alternativas para lograr saltos sustanciales de rendimiento.
Impacto en el rendimiento y expectativas
- El nuevo JIT de copy-and-patch en CPython 3.13 muestra una mejora de ~2–9% en las pruebas iniciales.
- Algunos ven esto como ya significativo, especialmente dado que CPython está basado en C y los cambios son mínimos; otros lo encuentran poco impresionante frente a alternativas como PyPy o GraalPython, que afirman mejoras de varias veces.
- El impacto es limitado al principio: solo las funciones que contienen un salto hacia atrás (es decir, bucles como
while/for) se compilan con JIT. - Varios comentarios subrayan que esto es trabajo preliminar; muchas pequeñas mejoras a lo largo de varias versiones pueden acumularse de forma importante, aunque ninguna versión por sí sola sea espectacular.
Diseño del JIT y compromisos técnicos
- El JIT usa un enfoque de “copy-and-patch” / plantilla: las implementaciones en C de los opcodes se compilan en fragmentos de código relocatable, que se ensamblan en tiempo de ejecución para secuencias específicas de bytecode de Python.
- Esto reutiliza la lógica existente del intérprete, reduce la complejidad nueva y evita incluir LLVM en tiempo de ejecución (las herramientas de LLVM solo se necesitan en tiempo de compilación).
- Principalmente elimina la sobrecarga de despacho del intérprete; optimizaciones más profundas (por ejemplo, fusión de instrucciones, micro-operaciones, JITs multinivel) se discuten como posibles, pero aún no se han materializado.
- Algunos dudan de hasta dónde puede llegar un diseño copy-and-patch sin un JIT “completo” de optimización y un análisis más agresivo a nivel de IR.
Comparación con otros runtimes e implementaciones
- Otros runtimes de Python con JIT o alternativos mencionados: PyPy (media geométrica
4.8x más rápido en sus benchmarks), GraalPython (4.3x más rápido en pyperformance), Jython, IronPython y varias herramientas AOT (Nuitka, mypyc, Shedskin, Numba, Cython). - Ninguna de las VMs alternativas ha logrado reemplazar ampliamente a CPython debido a la compatibilidad (especialmente con extensiones C), el comportamiento de calentamiento y el coste de mantenimiento.
- Se citan motores de JavaScript (V8, JavaScriptCore, SpiderMonkey) como evidencia de que los lenguajes dinámicos pueden hacerse mucho más rápidos, pero tenían menos restricciones de extensiones nativas y una inversión corporativa enorme.
Tipado dinámico, type hints y límites de optimización
- La dinamicidad de Python (funciones reasignables, monkey-patching, adición de campos en tiempo de ejecución, enteros boxeados) se cita repetidamente como una barrera central para alcanzar rendimiento tipo C.
- Existen type hints opcionales, pero no son sólidos y en su mayoría los aplican herramientas externas (por ejemplo, mypy); las anotaciones actuales no se consideran lo bastante fiables para grandes optimizaciones de JIT.
- Algunos sugieren que los JITs deberían basarse en el perfilado en tiempo de ejecución y en guards, como en los motores modernos de JS.
Ecosistema, empaquetado y restricciones de extensiones C
- Un tema principal: la velocidad de Python para muchas cargas de trabajo ya proviene de extensiones en C/C++/Fortran/Rust (NumPy, PyTorch, BLAS, etc.), con Python actuando sobre todo como “pegamento”.
- Esta API de C es a la vez una fortaleza y una gran limitación: expone internos de CPython, lo que hace difíciles los cambios radicales de la VM y costosas de adaptar las implementaciones alternativas.
- Se discuten las frustraciones de empaquetado y despliegue (virtualenvs, Poetry, Docker, falta de herramientas sencillas de cross-compilación/binario único) como problemas serios, a veces vistos como más urgentes que la velocidad bruta del intérprete.
Papel del lenguaje, filosofía y reacciones de la comunidad
- Muchos sostienen que Python es “lo bastante rápido” para las tareas típicas ligadas a IO e integración; donde el rendimiento realmente importa, la gente recurre a bibliotecas nativas u otros lenguajes.
- Otros temen que Python se esté quedando demasiado atrás respecto a lenguajes como Rust, Go, Java o incluso JS en velocidad bruta, y esperan que este JIT sea el comienzo de un trabajo de optimización más agresivo.
- Hay debate sobre la complejidad: el diseño anterior de CPython favorecía la simplicidad por encima de la velocidad, pero el uso a gran escala (especialmente en datos y ML) y la nueva financiación corporativa están impulsando internals más sofisticados.