Python 3.15.0 ya es versión final (anunciada el 9 de octubre de 2026). Es una release con muchas piezas que tocan el día a día de quien mantiene servicios en producción: imports perezosos para arrancar más rápido, un profiler de muestreo integrado, frame pointers activados por defecto y un cambio de codificación por defecto que conviene probar con calma.
Qué cambia
Según el anuncio oficial, las novedades principales son:
- Intérprete: tipo
sentinel(PEP 661), UTF-8 como codificación por defecto (PEP 686), desempaquetado en comprehensions (PEP 798), imports perezosos explícitos (PEP 810), el tipofrozendict(PEP 814), ficheros de configuración de arranque para paquetes (PEP 829) y mejores mensajes de error. - Biblioteca estándar: un paquete de profiling dedicado y el profiler de muestreo de alta frecuencia Tachyon (PEP 799), además de más salida en color.
- Tipado:
TypedDictcon items extra tipados (PEP 728),TypeForm(PEP 747) y bases disjuntas (PEP 800). - API de C:
PyBytesWriter(PEP 782), protección frente a la finalización (PEP 788) y ABI estable para builds free-threaded (PEP 803, 820 y 793). - Build: frame pointers activados por defecto para observabilidad a nivel de sistema (PEP 831).
El JIT experimental mejora de forma notable: un 7–8 % de media geométrica frente al intérprete estándar en x86-64 Linux y un 11–12 % frente al intérprete con tail calls en AArch64 macOS. Los binarios oficiales de macOS instalan ahora soporte free-threading por defecto y los de Windows de 64 bits usan el intérprete con tail calls.
Por qué importa en producción
Lo que más me interesa como SRE no es el JIT, sino tres cosas. Primero, los lazy imports (PEP 810): en CLIs, funciones serverless y workers que arrancan muchas veces, el tiempo de import suele dominar el cold start. Segundo, los frame pointers por defecto (PEP 831) y el profiler Tachyon: facilitan perfilar un proceso Python con herramientas de sistema sin recompilar nada. Tercero, el UTF-8 por defecto (PEP 686): es el cambio con más riesgo de sorpresa, porque cualquier código que abra ficheros sin indicar encoding y dependa de la configuración regional puede comportarse distinto. El anuncio lo lista como novedad y no detalla el impacto de compatibilidad, así que hay que leer la documentación "What's New" antes de dar nada por hecho.
Hay además un aviso concreto: en macOS 27.0, IDLE y otras apps tkinter pueden quedarse colgadas al abrir diálogos por un cambio del sistema operativo; el proyecto recomienda esperar a un workaround (incidencia #158053). No afecta a servidores Linux, pero sí a máquinas de desarrollo.
Qué haría yo
- Leer "What's New in Python 3.15" completo, en especial las secciones de deprecaciones y eliminaciones, que el anuncio no enumera.
- Añadir 3.15 a la matriz de CI como job no bloqueante y ejecutar la suite con avisos como errores:
python3.15 -W error -m pytest -q- Buscar
open(sinencoding=yread_text()sin codificación explícita, y fijarencoding="utf-8"donde el comportamiento deba ser estable. - Medir el arranque antes y después con
python3.15 -X importtime -c "import mi_app"e identificar qué imports merece la pena volver perezosos. - Probar el JIT y el free-threading solo en un entorno aislado y con benchmarks propios: la mejora publicada es una media y puede no reflejar tu carga.
- No actualizar producción hasta que tus dependencias publiquen wheels para 3.15.