Python 3.15 ya está aquí: importaciones diferidas, el profiler Tachyon y un JIT 1,2x más rápido
Ya está disponible Python 3.15. Lo más relevante de la versión son las importaciones diferidas explícitas (PEP 810), el desempaquetado en comprehensions (PEP 798) y el profiler de muestreo Tachyon, integrado en el módulo profiling.sampling. En velocidad, la versión apenas se distingue de la 3.14, pero el JIT experimental logró 1,2x en una prueba con números de Fibonacci (medición de Miguel Grinberg sobre 3.15.0rc3). Con el lanzamiento de 3.15, Python 3.10 queda oficialmente fuera de soporte. Para los autores de bibliotecas, esto significa que ya pueden fijar 3.11 como versión mínima. • Las importaciones diferidas reducen el tiempo de arranque de las utilidades CLI. • Tachyon sustituye a profilers externos como py-spy. • Python 3.10 ya no tiene soporte.
Procesado por IA desde Simon Willison; editado por Hamidun News
Python 3.15 ya es oficial. Para la mayoría de los desarrolladores, lo esencial se resume en tres puntos: las importaciones diferidas explícitas, el profiler Tachyon en la biblioteca estándar y la nueva sintaxis de desempaquetado en list comprehensions. La velocidad del intérprete apenas ha cambiado respecto a 3.14, pero el JIT experimental muestra por primera vez una mejora apreciable: 1,2x. Además, Python 3.10 (de 2021) pierde oficialmente el soporte. Para los mantenedores de bibliotecas, esto pesa más que cualquier sintaxis nueva: el límite inferior de compatibilidad sube a 3.11. El resumen de cambios para «What's new» de este año lo ha preparado Hugo van Kemenade, release manager de las versiones 3.14 y 3.15.
Importaciones diferidas, desempaquetado y Tachyon
La novedad más práctica es el PEP 810. Ahora un módulo se puede declarar así: `lazy import json` o `lazy from pathlib import Path`. La importación real se produce la primera vez que se accede al símbolo. El desarrollador Simon Willison, autor de la utilidad CLI LLM y de su sistema de plugins, llevaba tiempo chocando con este problema. Los plugins con dependencias pesadas, como `sentence_transformers`, añadían varios segundos a cada llamada del comando `llm`. En la documentación para autores de plugins, Willison tenía que recomendar importaciones diferidas manuales. Ahora lo resuelve el propio lenguaje.
El segundo cambio es el PEP 798 (autores: Adam Hartz y Erik Demaine). Añade desempaquetado dentro de las comprehensions: `[L for L in lists]` aplana una lista de listas, `{s for s in sets}` une conjuntos y `{**d for d in dicts}` fusiona diccionarios. Es la continuación del PEP 448, que llegó con Python 3.5 en 2015.
El tercero son los profilers. El habitual `cProfile`, de tipo tracing, pasa a llamarse `profiling.tracing`. A su lado aparece `profiling.sampling`, de muestreo, conocido como Tachyon. Captura periódicamente las pilas de un proceso en ejecución y calcula dónde se gasta el tiempo. Su sobrecarga es baja y no requiere instrumentar el código de antemano. Hasta ahora, para esto se instalaban herramientas externas como py-spy. Ahora la función viene integrada en la biblioteca estándar.
En el ejemplo del resumen, el profiler recogió 2 651 muestras en 2,65 segundos, a una frecuencia de unas 1000 por segundo. Lo más visible es que el proceso pasó casi todo el tiempo inactivo, esperando al bucle de eventos de asyncio. El resultado se puede mostrar como flame graph y heat map, así como en el formato de la interfaz de Firefox Profiler. En macOS hizo falta `sudo` para conectarse al proceso por PID.
Velocidad: por fin se nota el JIT
No conviene esperar una mejora de velocidad «gratis». Miguel Grinberg comparó 3.15.0rc3 con 3.14 y concluyó que el rendimiento se mantiene prácticamente igual. La excepción es el JIT experimental.
- JIT frente al intérprete estándar de 3.15: 1,2x en la prueba de Fibonacci.
- Es la primera vez que Grinberg observa una mejora significativa gracias al JIT.
- A modo de comparación: el año pasado, 3.14 superó claramente a 3.13 en muchas más categorías.
- Profiler Tachyon: frecuencia de unas 1000 muestras por segundo, sin instrumentación previa.
Cómo actualizar y qué aporta dejar atrás 3.10
Si trabajas con `uv`, la migración requiere pocos comandos. Primero hay que actualizar la propia herramienta para que conozca la nueva versión: `uv self update`. Después se instala el intérprete: `uv python install 3.15`. Para convertirlo en la versión predeterminada de cualquier `uv run` en el que el proyecto no fije otra, se ejecuta `uv python pin --global 3.15`. Para comprobarlo: `uv run python --version`. Las utilidades ya instaladas se reinstalan con la versión deseada, por ejemplo `uv tool upgrade datasette --python 3.15`.
Para los mantenedores, lo interesante es la otra cara de la moneda. La política de Willison es dar soporte a todas las versiones vivas de Python. Como 3.10 ya no tiene soporte, se pueden aprovechar las capacidades de 3.11:
- `tomllib` en la biblioteca estándar;
- `asyncio.TaskGroup` y `asyncio.timeout()`;
- `datetime.UTC` como alias de `datetime.timezone.utc`;
- en `sqlite3`: `setlimit()`/`getlimit()`, `create_window_function()`, `blobopen()` para la lectura parcial de BLOB grandes y `set_authorizer(None)` para retirar el autorizador;
- un sistema de tipos notablemente ampliado.
En Datasette, el primer PR (n.º 2998) ya elimina el rodeo para `set_authorizer(None)`. Las plantillas cookiecutter para click-app, datasette-plugin, python-lib y llm-plugin se prueban ahora en las versiones de 3.11 a 3.15. La conclusión práctica para tu proyecto es esta: revisa la matriz de CI, elimina 3.10 y añade 3.15. Conviene probar primero las importaciones diferidas en herramientas CLI con dependencias pesadas. Allí la mejora en el tiempo de arranque se nota de inmediato.
Access Frontier LLMs & Multimodal AI in One Workspace
Discover NomadNet AI (nomadnet.ai) — unified access to frontier language models, research synthesis, and multimodal workflows.
Lo esencial de la IA — una vez por semana
Siete historias que de verdad importaron, elegidas a mano. Sin ruido ni notas de prensa.
¡Listo! Revisa tu correo para la confirmación.