Python 3.15: lo más relevante, adiós 3.10 y por fin puedo usar 3.11
Python 3.15 ya está disponible con características clave como importaciones perezosas explícitas, desempaque en comprehensiones y un profiler por muestreo en la stdlib. También es el momento de dejar atrás Python 3.10 y empezar a aprovechar funciones que llegaron en 3.11.
Python 3.15 llega y cambia el panorama
Python 3.15 se publicó recientemente, con un resumen curado por Hugo van Kemenade, release manager de 3.14 y 3.15. Para quienes mantienen proyectos open source compatibles con múltiples versiones de Python, este lanzamiento trae varias mejoras prácticas: desde optimizaciones para el arranque hasta herramientas integradas para diagnóstico de rendimiento.
En mi caso, que mantengo herramientas y plugins como parte de un ecosistema abierto, la llegada de 3.15 me permite dejar oficialmente atrás Python 3.10 (publicado en 2021) y empezar a incorporar características de Python 3.11 en mis proyectos.
Importaciones perezosas explícitas (PEP 810)
Una de las novedades que más me entusiasman son las importaciones perezosas explícitas definidas en PEP 810. Con esta sintaxis es posible declarar que ciertos módulos se importen solo cuando se usen por primera vez:
lazy import json
lazy from pathlib import Path
En entornos donde los plugins o dependencias pesadas aumentan el tiempo de arranque —por ejemplo, aplicaciones CLI que cargan modelos o librerías de ML— las importaciones perezosas reducen la latencia inicial. En mi herramienta CLI para LLMs tuve que recomendar a los desarrolladores de plugins que gestionaran manualmente estas importaciones porque dependencias como sentence_transformers podían sumar varios segundos al arranque. Ahora esa optimización puede ser nativa y explícita en el lenguaje.
Para equipos y proveedores de servicios en la nube en Latinoamérica, donde los costos de ejecución y la experiencia de usuario en entornos serverless o contenedores son sensibles al tiempo de inicio, esta característica puede tener impacto directo en operaciones y costos.
Desempaque en comprehensiones (PEP 798)
PEP 798 amplía el desempaque introducido en PEP 448 (de Python 3.5) para permitir el uso de operadores de desempaque dentro de comprensiones. Algunos ejemplos extraídos de la documentación:
lists = [[1, 2], [3, 4], [5]]
[*L for L in lists] # [1, 2, 3, 4, 5]
sets = [{1, 2}, {2, 3}, {3, 4}]
{*s for s in sets} # {1, 2, 3, 4}
dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
{**d for d in dicts} # {'a': 3, 'b': 2}
Este azúcar sintáctico hace que ciertas transformaciones sean más concisas y legibles, útil en pipelines de datos y manipulaciones habituales en aplicaciones web y de análisis.
Un profiler por muestreo en la lib estándar: Tachyon (profiling.sampling)
Otra incorporación relevante es el profiler por muestreo llamado Tachyon (profiling.sampling), que se suma al renombrado profiler de trazado (anteriormente cProfile, ahora profiling.tracing). Los profilers por muestreo capturan periódicamente los stack traces de procesos en ejecución y, con muy bajo overhead, permiten identificar funciones que consumen más tiempo sin necesidad de instrumentar el código.
Hasta ahora muchos desarrolladores usaban herramientas externas como py-spy para este propósito; con 3.15 esta capacidad está integrada en la stdlib. Si cuentan con el PID de un proceso Python 3.15 en ejecución, pueden comenzar a recolectar muestras con un comando como este (en macOS puede requerir sudo):
sudo uv run --python 3.15 python -m profiling.sampling attach 1234
Tras interactuar con el programa y detener la recolección con Ctrl+C, se obtiene un informe. El profiler también puede generar flame graphs, heat maps y salidas compatibles con la UI del profiler de Firefox. Para equipos de operaciones y desarrolladores en Latinoamérica, disponer de estas herramientas integradas facilita diagnosticar cuellos de botella en producción sin depender de software adicional.
¿Es 3.15 más rápida que 3.14?
Las pruebas de rendimiento no muestran grandes diferencias generales entre 3.14 y 3.15; Miguel Grinberg exploró esta pregunta con la release candidate de 3.15 y encontró que el rendimiento es en su mayoría similar al de 3.14. La excepción notable fue el JIT experimental: en un test de Fibonacci mostró un incremento de alrededor de 1.2x frente al intérprete estándar, la primera observación de un beneficio de JIT significativo en este ciclo.
Si su stack depende de micro-optimizaciones o de cargas CPU-intensivas, conviene validar casos concretos antes de esperar mejoras automáticas al actualizar.
Cómo actualizar con uv (ejemplo práctico)
Para quienes usan uv como gestor de versiones y herramientas Python, el proceso para adoptar 3.15 en macOS fue el siguiente:
uv self update
uv python install 3.15
uv python pin --global 3.15
uv run python --version
Además, si tienen herramientas instaladas vía uv tool install, pueden reinstalarlas para usar Python 3.15:
uv tool upgrade datasette --python 3.15
datasette --get /-/versions.json | jq
Estos pasos facilitan que proyectos y herramientas locales migren a la nueva versión sin grandes fricciones.
El fin de Python 3.10 y las ganancias de 3.11
Con 3.15, Python 3.10 entra en mantenimiento final y ya no recibe soporte. Eso permite a mantenedores dejar de garantizar compatibilidad con 3.10 y aprovechar funcionalidades que llegaron en 3.11. Entre las mejoras relevantes de 3.11 que vale la pena mencionar:
- tomllib ahora está disponible en la stdlib, útil para leer TOML sin dependencias externas.
- asyncio incorporó TaskGroup y timeout(), que mejoran la gestión de concurrencia y timeouts en código asíncrono.
- datetime.UTC se añadió como alias de datetime.timezone.utc.
- Mejoras en el soporte de SQLite: setlimit() y getlimit(), create_window_function(), blobopen(), y la posibilidad de llamar a set_authorizer(None) para eliminar un authorizer.
En proyectos como Datasette, que usan intensivamente asyncio y SQLite, estas mejoras son especialmente relevantes. Yo ya comencé a aterrizar cambios: por ejemplo, eliminé un workaround que tenía para set_authorizer(None) y estoy actualizando plantillas cookiecutter y pruebas para que cubran desde Python 3.11 hasta 3.15.
Qué significa esto para organizaciones y desarrolladores en Latinoamérica
- Migración responsable: con el fin del soporte para 3.10, es un buen momento para auditar dependencias y pipelines de CI. Prioricen pruebas automáticas para detectar incompatibilidades.
- Menores costos operativos: importaciones perezosas y el profiler de muestreo pueden reducir tiempos de arranque y facilitar diagnósticos, lo que se traduce en ahorro en entornos cloud y mejor experiencia de usuario.
- Herramientas integradas: tener profiling.sampling en la stdlib simplifica flujos de trabajo de observabilidad, relevante para equipos con recursos limitados que prefieren no depender de herramientas externas.
Conclusión
Python 3.15 introduce características prácticas —importaciones perezosas explícitas, desempaque en comprehensiones y un profiler por muestreo integrado— que mejoran tanto la ergonomía del desarrollo como las capacidades de diagnóstico. Aunque el rendimiento general frente a 3.14 no cambia drásticamente, el JIT experimental ya muestra resultados prometedores en casos concretos.
Para mantener proyectos sanos y optimizados, especialmente en contextos empresariales y startups en Latinoamérica, conviene planear la migración desde 3.10, actualizar herramientas como uv y aprovechar las APIs y mejoras que 3.11 y 3.15 ofrecen.
Fuente original: Simon Willison