Python 3.15: un avance cauteloso con JIT experimental y mejoras de desarrollo

Python 3.15

Python 3.15.0 ya está entre nosotros. La versión estable se publicó el 9 de octubre de 2026 y llega después de una recta final algo accidentada: el equipo retrasó una semana el lanzamiento para meter un arreglo de última hora relacionado con las importaciones perezosas. En total, hablamos de 5.643 commits firmados por 1.012 contribuyentes, una cifra que da idea del trabajo colectivo detrás de esta entrega. No es solo una actualización de mantenimiento: toca el motor de ejecución, la forma de leer archivos, los imports, el sistema de tipos y las herramientas para diagnosticar procesos.

Para quien programa en España o trabaja con equipos europeos, el detalle importante es que muchos de estos cambios afectan al día a día. Scripts de render, automatizaciones, APIs, funciones serverless y pipelines de datos pueden notar mejoras o requerir ajustes. En herramientas como Blender, Maya o Houdini, la promesa es que ciertas tareas de render y automatización esperen menos si el JIT encaja con la carga. Eso sí, conviene separar dos cosas: que Python 3.15 sea estable no significa que todas sus piezas nuevas estén listas para producción. El compilador JIT sigue etiquetado como experimental y su adopción dependerá del tipo de carga y del margen de riesgo de cada proyecto.

El JIT experimental empieza a enseñar resultados en Python 3.15

El compilador JIT es el protagonista de esta entrega. En Linux sobre x86-64, las pruebas citadas por la documentación y por medios como Real Python apuntan a una mejora de entre el 7% y el 8% frente al intérprete estándar, medida como media geométrica. En macOS con AArch64, la horquilla sube al 11%-12% frente al intérprete con tail-calling. Son referencias distintas, así que no conviene mezclar ambos porcentajes como si salieran del mismo examen.

El benchmark informal de Grinberg ayuda a bajar las cifras al barro. En pruebas de un solo hilo, 3.15 apenas se despega de 3.14: Fibonacci tarda 6,94 segundos frente a 7,17, y una burbuja de 10.000 elementos pasa de 2,06 a 1,97 segundos. La cosa cambia cuando entra el JIT: Fibonacci baja a 5,76 segundos frente a los 6,94 del intérprete normal, y la burbuja mejora un 28% respecto al modo estándar. Es la primera vez que el JIT supera con claridad al intérprete convencional en ambas pruebas, aunque su etiqueta experimental sigue pesando.

El free-threading, o ejecución sin GIL, tampoco trae una revolución en esta versión. Los resultados de Grinberg quedan cerca de 3.14 en cargas de un hilo. Donde se nota es al usar varios hilos: una prueba de Fibonacci con cuatro hilos termina en 7,24 segundos con free-threading, frente a más de 32 segundos del intérprete estándar. Aun así, PyPy y Rust siguen muy por delante en rendimiento bruto, y el propio autor recomienda no llevar el JIT a producción hasta que deje de ser experimental. Las novedades de lenguaje, más que la velocidad pura, son el argumento principal para actualizar ya.

Los benchmarks de InfoWorld sobre la alpha de 3.15 dejaban un caso llamativo: el clásico n-body caía de 7,6 a 4,2 segundos con JIT en la misma máquina, cerca de un 45% menos. PyPy seguía siendo más rápido en bruto en esa prueba, con 0,7 segundos, pero CPython con JIT y sin GIL ya se ponía por delante en escenarios I/O-bound gracias al paralelismo entre hilos. La frase que resumía el artículo era que todavía no existe una build de CPython que active JIT y free-threading a la vez, aunque no falta mucho para verla. En el benchmark de Grinberg, PyPy 3.12 se impuso a CPython estándar con una ventaja de 5,54 veces en Fibonacci y 18,37 veces en burbuja, mientras Rust 1.97 lideró con 77,24 y 50,42 veces, respectivamente, y Node 26.3 quedó segundo.

UTF-8, imports perezosos y tipos nuevos

Uno de los cambios que más se van a notar es UTF-8 como codificación predeterminada, recogido en PEP 686. Hasta ahora, abrir un archivo sin indicar encoding dependía del locale del sistema, lo que provocaba errores difíciles de reproducir al mover archivos entre máquinas. A partir de 3.15, leer y escribir texto en UTF-8 será lo normal, algo especialmente útil para equipos que comparten proyectos entre España, Europa y otros territorios con configuraciones regionales distintas.

Los imports perezosos declarativos, PEP 810, llegan para atacar el tiempo de arranque. En lugar de cargar módulos pesados al inicio, el intérprete puede esperar a que se necesiten de verdad. Esto interesa a CLIs, notebooks, lambdas y servicios serverless, donde los cold starts se comen una parte importante del presupuesto. También se pueden limpiar los viejos trucos de meter imports dentro de funciones para ahorrar unos milisegundos.

En el apartado de tipos y estructuras, aparecen dos nombres que suenan a nuevo pero responden a problemas viejos: frozendict y sentinel. El primero, PEP 814, es un diccionario inmutable que puede usarse como clave de caché o dentro de conjuntos, algo que antes se resolvía con subclases de dict poco elegantes. El segundo, PEP 661, ofrece un objeto único para representar ausencia de valor sin inventar un object() distinto en cada módulo. Son cambios pequeños que evitan errores repetidos en configuraciones, parsers, pipelines de datos y herramientas 3D.

Python 3.15 también amplía el sistema de tipos con PEP 728, PEP 747 y PEP 800. El primero permite anotar TypedDict con claves extra tipadas; el segundo facilita anotar tipos en sí mismos, útil para decoradores y factorías; y el tercero ayuda a que el comprobador entienda bases disjuntas y reduzca errores en tiempo de ejecución. En la biblioteca estándar se incorpora Tachyon, un profiler estadístico de alta frecuencia dentro del paquete de herramientas de profiling de PEP 799. Para quien persigue latencia en backends o procesos de machine learning, tener un sampler serio sin depender de py-spy o scalene simplifica bastante el diagnóstico.

Más piezas técnicas y avisos antes de actualizar

En la C API, la cosa se mueve hacia el free-threading estable. Los PEP 803, 820 y 793 estabilizan el ABI para builds sin GIL, y los binarios oficiales de macOS ya instalan soporte free-threading por defecto. En Windows de 64 bits, el intérprete con tail-calling también pasa a ser la opción predeterminada. Para quien mantiene extensiones nativas o wheels compiladas, esto significa que toca revisar compatibilidad antes de dar el salto y no fiarse solo de que el código Python funcione.

También hay cambios pensados para observar mejor lo que hace el programa. Los frame pointers vienen activados por defecto, lo que facilita el perfilado y la observabilidad en producción. Y en el terreno del lenguaje, se añade el desempaquetado con el operador estrella dentro de comprehensions: se pueden aplanar listas anidadas o combinar diccionarios con una sintaxis más directa, evitando funciones intermedias o comprensiones anidadas difíciles de leer.

El lanzamiento no está exento de problemas. Las notas oficiales avisan de un fallo en macOS 27.0 con aplicaciones que usan tkinter, incluido IDLE: al abrir diálogos del menú pueden colgarse y mostrar la temida bola de colores. El equipo lo atribuye a un cambio de comportamiento del sistema operativo y remite al issue #158053. Si dependes de Tk, lo sensato es posponer la actualización a macOS 27.0 hasta que exista una solución temporal o definitiva.

El ciclo de publicación también dejó datos curiosos. La release candidate 3.15.0rc3, del 2 de octubre, acumulaba 156 correcciones de errores aportadas por 82 contribuyentes desde rc2. El retraso final de una semana se debió a un arreglo de lazy-import, lo que da una idea de la prioridad que se dio a esa función. En paralelo, el índice TIOBE de septiembre de 2026 mantiene a Python en el primer puesto con un 17,76% de cuota, aunque con una tendencia descendente durante el año. C baja al 10,28%, C++ sube al 8,67% y Java cae al 7,54%. Rust cumple su tercer mes consecutivo en el top 10 con un 1,34%, y Julia se acerca al puesto 21 con un 0,74%. La presión por runtimes con paralelismo real es cada vez más evidente.

Para quien quiera trastear sin leer toda la especificación, Barry Warsaw publicó whatsnewt, un juego de texto en TUI con 18 puzles que repasan las novedades de 3.15. Se ejecuta con uvx –python 3.15 whatsnewt y usa pyrefly como comprobador de tipos. Es una forma entretenida de probar las características nuevas antes de llevarlas a un proyecto serio.

Si tu equipo se plantea migrar, hay una hoja de ruta razonable. Conviene auditar el runtime, probar los imports perezosos en cargas serverless o CLIs, validar que las extensiones C tengan wheels compatibles con el ABI free-threaded y limpiar los encoding explícitos que ya no hacen falta. Muchas fuentes coinciden en que 3.14 sigue siendo una apuesta segura durante las próximas cuatro a seis semanas, mientras 3.15 pasa por staging y trabajos batch no críticos. En macOS, mejor esperar a que tkinter tenga workaround antes de subir a 27.0.

Python 3.15 aterriza como una versión estable con muchas piezas interesantes, pero no como una bala de plata en rendimiento. El JIT experimental mejora en escenarios concretos, UTF-8 por defecto y los imports perezosos prometen menos sorpresas y arranques más rápidos, y los nuevos tipos, el profiler Tachyon y el free-threading amplían el terreno para proyectos que quieran afinar sus pipelines. En el lado menos amable, el ecosistema de extensiones aún va con retraso, el JIT no debería entrar en producción sin pruebas y macOS 27.0 tiene un problema conocido con tkinter. Para equipos en España y Europa, la recomendación práctica es medir antes de adoptar, mantener 3.14 como red de seguridad y aprovechar esta versión para experimentar con calma en entornos controlados.

from Linux Adictos https://ift.tt/QGR130e
via IFTTT