14 puntos por GN⁺ 2024-09-29 | 3 comentarios | Compartir por WhatsApp

Principales cambios en Python 3.13

  • Se espera que CPython v3.13.0 se lance el 7 de octubre de 2024
  • Esta versión incluye dos cambios importantes que podrían tener un gran impacto en el rendimiento de Python
    • Una versión "free-threaded" que permite desactivar el Global Interpreter Lock (GIL)
    • Soporte experimental para compilación Just-in-Time (JIT)

Global Interpreter Lock (GIL)

¿Qué es el GIL?

  • Python fue diseñado e implementado como un lenguaje interpretado de un solo hilo por Guido Van Rossum a finales de los años 80
  • Python compila el código fuente a bytecode y luego el intérprete lo ejecuta
  • Para acceder de forma segura a los objetos desde todos los hilos, usa un bloqueo global (GIL)
    • Es un bloqueo global de exclusión mutua que impide que varios hilos ejecuten bytecode al mismo tiempo
  • Limita el uso de memoria compartida, pero favorece el rendimiento en un solo hilo

Por qué Python tiene GIL

  • A principios de los años 90, la mayoría de los programas eran de un solo hilo y el rendimiento de un solo núcleo aumentaba rápidamente
  • No era necesario sacrificar el rendimiento de un solo hilo para obtener seguridad en múltiples hilos
  • Se podían usar múltiples procesos para aprovechar varios núcleos (módulo multiprocessing)

¿Por qué quitar el GIL ahora?

  • Los desarrolladores del core de Python han querido eliminar el GIL desde hace mucho tiempo, pero no pudieron hacerlo por el temor a degradar el rendimiento de un solo hilo
  • Ahora que los procesadores multinúcleo son algo común, las limitaciones del multithreading por culpa del GIL se han vuelto un problema
  • El proyecto "Faster CPython", patrocinado por Microsoft, ha contribuido a mejorar el rendimiento de Python
  • Sam Gross propuso una implementación sin GIL y se adoptó el PEP 703
  • Plan de adopción gradual: opción experimental → soporte oficial → modo predeterminado
  • En este contexto, se aprobó un plan para eliminar gradualmente el GIL

¿Qué tal el rendimiento?

  • Al activar free-threading, el rendimiento en un solo hilo baja alrededor de 20%
  • El multithreading con el GIL desactivado muestra mejoras de rendimiento considerables
  • El multithreading con el GIL activado es más lento que el single-threading
  • El multithreading con el GIL desactivado ofrece un rendimiento similar al multiprocessing

¿Cómo usar Python con free-threading?

  • Si instalas Python 3.13.0rc2t con pyenv, puedes usar la versión con free-threading
  • El GIL viene desactivado de forma predeterminada, y puede volver a activarse en tiempo de ejecución con -X gil=1
  • Si haces import de un módulo que no soporta GIL free, el GIL se activa automáticamente

Compilador JIT (Just-in-Time)

¿Qué es JIT?

  • A diferencia de la compilación tradicional ahead-of-time, es una técnica que genera machine code justo antes de la ejecución
  • Antes de Python 3.13, el bytecode se convertía y ejecutaba como lenguaje máquina una instrucción a la vez
  • Con la introducción de JIT, el bytecode puede convertirse a lenguaje máquina de una sola vez y actualizarse cuando sea necesario
  • La técnica introducida en Python 3.13 es un JIT de tipo "copy-and-patch", que parchea como native code el bytecode que coincide con plantillas predefinidas
  • Los compiladores JIT más avanzados pueden optimizar las zonas "hot" del código que se ejecutan con frecuencia

¿Qué impacto tendrá JIT?

  • A corto plazo, no habrá grandes cambios en la forma de escribir o ejecutar código Python
  • Sin embargo, se espera que las mejoras graduales de rendimiento le permitan competir con otros lenguajes

¿Cómo usar JIT?

  • En Python 3.13, JIT es experimental y no está activado por defecto
  • Puede activarse al compilar con la opción PYTHON_CONFIGURE_OPTS="--enable-experimental-jit"
  • En tiempo de ejecución, su activación puede controlarse con PYTHON_JIT=0/1

Conclusión

  • Python 3.13 es una gran release que introduce nuevos conceptos y funciones interesantes en el runtime
    • La eliminación del GIL y la incorporación de JIT anticipan cambios importantes
  • Aunque no habrá cambios grandes a corto plazo, a largo plazo tendrá un impacto positivo en el rendimiento de Python
    • Se espera que, a medida que free-threading y JIT maduren, influyan mucho en el rendimiento, especialmente en tareas CPU-bound

Opinión de GN⁺

  • Esta actualización de Python 3.13 parece que traerá cambios importantes al ecosistema de Python. Se espera que la eliminación del GIL reduzca los cuellos de botella del multithreading y que la introducción de JIT mejore la velocidad general de ejecución.
  • Aun así, tomará tiempo para que estos cambios se estabilicen por completo. Podrían surgir problemas de compatibilidad con paquetes existentes, como extensiones en C, y al programar con múltiples hilos podrían aparecer nuevos errores, como race conditions.
  • La lentitud de Python ha sido señalada como una desventaja, y ojalá esta actualización ayude a mejorar esa percepción. Si a sus ventajas actuales de productividad y legibilidad se suma la velocidad, Python podría convertirse en un lenguaje todavía más usado.
  • Aun así, en el fondo sigue existiendo la limitación de ser un lenguaje de tipado dinámico. También debería continuar el esfuerzo por incorporar ventajas de los lenguajes de tipado estático. Parece posible resolver esto hasta cierto punto aprovechando activamente herramientas como type hinting y Cython, introducidas recientemente en Python.
  • En conjunto, Python 3.13 parece traer cambios interesantes y positivos. Se espera que los desarrolladores entiendan bien estos cambios y los aprovechen para crear mejores programas en Python

3 comentarios

 
ilotoki0804 2024-09-30

Aunque tanto la eliminación del GIL como el JIT todavía sean modestos por ahora, ambos son avances muy importantes que cambiarán el rumbo de Python. Es emocionante pensar en el futuro de Python, dejando atrás la mala fama de ser "el lenguaje más lento" y con expectativas de que se use en aún más áreas de aquí en adelante.

 
ilotoki0804 2024-09-30

Sobre la importancia del free threading (eliminación del GIL), está bien resumida en PEP 703, junto con las opiniones de varias personas.
Además, según ese PEP, la caída de rendimiento en un solo hilo sería de apenas 5~6%, así que cuesta creer la afirmación de ese artículo y de algunos comentarios en HN de que habría una caída de rendimiento del 20~50%. Tampoco hay una fuente verificable.

 
GN⁺ 2024-09-29
Comentarios de Hacker News
  • Opinión de que eliminar el GIL haría que los programas normales de Python sean más lentos y aumentaría la complejidad

    • Dudas sobre los beneficios reales que se pueden obtener
    • Si es necesario aprovechar al máximo varios núcleos de CPU, se usa el enfoque de dejar que el sistema operativo ejecute múltiples instancias del programa y añadir la lógica de paralelización al programa
  • Queja sobre que no se puede descargar una versión con JIT activado

    • Se comparte la experiencia de que es posible compilar por cuenta propia una versión de Python 3.13, pero mucha gente no lo intenta ni da retroalimentación
  • Opinión de que se parece a la rima "Jack and Jill went up the hill"

    • Había confusión sobre qué significa "up the hill"
    • Duda sobre si lanzaron JIT pero quitaron el GIL o no
  • Experiencia de que desactivar el recolector de basura mejora mucho la velocidad en programas pequeños en memoria que se ejecutan por poco tiempo

    • Curiosidad sobre si esto se puede automatizar
    • Mención del riesgo de casos límite en los que un programa pequeño use toda la memoria
  • Opinión de que es un buen resumen para quienes no quedaron satisfechos con la explicación de la primera discusión sobre eliminar el GIL en 2021

  • Duda sobre si realmente es imposible optimizar el caso sin GIL

    • Opinión de que una ralentización del 20% es un problema importante
  • Noticia de que la fecha de lanzamiento cambió del 2 de octubre al 7 de octubre

    • Se proporciona un enlace relacionado
  • Opinión de que se citó una degradación de rendimiento del 20% para nogil, pero que podría llegar hasta el 50%

    • El JIT no ayuda mucho
    • Opinión de que es un lanzamiento decepcionante que refleja los problemas sociales y corporativos de CPython
    • Afirmación de que algunas personas prometen funciones, silencian a quienes no están 100% entusiasmados y entregan resultados por debajo de lo esperado
  • Opinión de que es un título sorprendente

  • Pregunta de alguien que busca un enlace a trabajos recientes sobre paralelización automática

    • Se proporciona un enlace sobre la idea de escribir código de un solo hilo y dejar que el compilador genere código multihilo