Proyecto de comparación de rendimiento entre diferentes versiones de Python con y sin GIL (Global Interpreter Lock).
El GIL (Global Interpreter Lock) es un mecanismo que permite que solo un thread ejecute código Python a la vez. Esto limita el rendimiento cuando usamos multithreading en tareas intensivas de CPU.
Python 3.14 introduce oficialmente soporte para free-threaded Python (sin GIL), permitiendo verdadero paralelismo en threads.
- Python 3.12.3 - Versión estable con GIL
- Python 3.14.0 - Última versión con GIL
- Python 3.14.0+freethreaded - Última versión sin GIL
uv es un gestor ultrarapido de entornos Python (escrito en Rust).
Opción 1 (recomendada):
curl -LsSf https://astral.sh/uv/install.sh | shOpción 2 (con pip):
pip install uvAlternativas: pyenv o conda.
# Python 3.14.0 con GIL
uv python install 3.14
# Python 3.14.0 sin GIL (free-threaded)
uv python install 3.14tuv python listtest_suma_cuadrados.py- Test de cálculo intensivo de suma de cuadradostest_primos.py- Test con búsqueda de números primostest_fibonacci.py- Test con cálculo de números de Fibonaccitest_version.py- Script simple para verificar versión de Pythonrun_benchmarks.sh- Script para ejecutar todos los benchmarks automáticamentedemo_versiones.sh- Script para demostrar cómo cambiar entre versionespyproject.toml- Configuración del proyecto para uv
./run_benchmarks.shEsto ejecutará todos los tests con las 3 versiones de Python y guardará automáticamente los resultados en un archivo resultados_YYYYMMDD_HHMMSS.txt.
Test de suma de cuadrados:
uv run --python 3.12.3 test_suma_cuadrados.py
uv run --python 3.14 test_suma_cuadrados.py
uv run --python 3.14t test_suma_cuadrados.pyTest de Fibonacci:
uv run --python 3.12.3 test_fibonacci.py
uv run --python 3.14t test_fibonacci.pyTest de números primos:
uv run --python 3.12.3 test_primos.py
uv run --python 3.14t test_primos.pyLas pruebas se realizaron en:
- Procesador: AMD Ryzen 7 (16 cores)
- Sistema Operativo: Ubuntu 24.04.3 LTS
- Kernel: Linux 6.14.0-33-generic
- Threads utilizados: 4 (de 16 núcleos disponibles)
Comparación de ejecución secuencial vs paralela con 4 threads.
Cálculo de suma de cuadrados hasta 10 millones, dividido en 4 rangos.
| Versión | Secuencial | Paralelo | Resultado |
|---|---|---|---|
| Python 3.12.3 (GIL) | 0.545s | 0.602s | Slowdown 1.10x |
| Python 3.14.0 (GIL) | 0.387s | 0.457s | Slowdown 1.18x |
| Python 3.14.0t (sin GIL) | 0.390s | 0.109s | Speedup 3.58x |
Busca números primos hasta 500,000 en 4 rangos. Encuentra 41,538 números primos.
| Versión | Secuencial | Paralelo | Resultado |
|---|---|---|---|
| Python 3.12.3 (GIL) | 0.443s | 0.543s | Slowdown 1.22x |
| Python 3.14.0 (GIL) | 0.377s | 0.458s | Slowdown 1.21x |
| Python 3.14.0t (sin GIL) | 0.434s | 0.156s | Speedup 2.79x |
Calcula 4 números de Fibonacci en posiciones diferentes: el número 350,000, 375,000, 400,000 y 425,000 de la secuencia.
| Versión | Secuencial | Paralelo | Resultado |
|---|---|---|---|
| Python 3.12.3 (GIL) | 4.385s | 5.178s | Slowdown 1.18x |
| Python 3.14.0 (GIL) | 5.801s | 7.257s | Slowdown 1.25x |
| Python 3.14.0t (sin GIL) | 5.791s | 1.801s | Speedup 3.22x |
Cuando el resultado muestra "Slowdown", significa que usar multithreading fue más lento que ejecutar todo secuencialmente. Esto ocurre por el GIL:
- El GIL impide que los threads se ejecuten realmente en paralelo
- Los threads se turnan para ejecutarse
- Hay overhead (costo adicional) por gestionar los threads
- Resultado: Peor rendimiento que hacer todo de forma secuencial
Cuando el resultado muestra "Speedup", significa que usar multithreading fue más rápido que ejecutar todo secuencialmente. Esto ocurre sin el GIL:
- Los threads pueden ejecutarse simultáneamente en diferentes núcleos de CPU
- Aprovecha el paralelismo real del hardware
- Speedup de 3.59x significa que es casi 4 veces más rápido
- Resultado: Mucho mejor rendimiento
Los resultados demuestran que Python 3.14t sin GIL logra paralelismo real usando los 4 threads:
-
Con GIL (Python 3.12/3.14): El multithreading es 10-25% más lento que secuencial
- Los 4 threads se turnan (solo 1 ejecuta a la vez)
- Hay overhead por gestionar threads sin beneficio
- No hay paralelismo real
-
Sin GIL (Python 3.14t): El multithreading es ~3x más rápido que secuencial
- Los 4 threads ejecutan simultáneamente en 4 núcleos de CPU
- Aprovecha el paralelismo real del hardware
- Paralelismo real ✅
-
Speedup promedio con 4 threads: 3.20x (cercano al ideal de 4x)
- Suma de cuadrados: 3.58x
- Búsqueda de primos: 2.79x
- Fibonacci: 3.22x
-
Python 3.14t es el futuro para aplicaciones con procesamiento paralelo intensivo
-
Python 3.14 con GIL en ejecución secuencial: más rápido que 3.12 en suma de cuadrados (~29%) y búsqueda de primos (~15%), pero más lento en Fibonacci (~32%)
Python 3.12/3.14 con GIL:
- Aplicaciones que no usan multithreading intensivo
- Scripts simples
- Compatibilidad con librerías existentes
Python 3.14 sin GIL:
- Aplicaciones con procesamiento paralelo intensivo
- Servidores web con muchas conexiones simultáneas
- Análisis de datos con múltiples threads
- Cualquier código CPU-intensivo que use threads