Optimización de Código con Numba en Python
Python es un lenguaje de programación interpretado, lo que significa que el código se ejecuta línea por línea en el momento de la ejecución. Esto puede resultar en un rendimiento más lento que los lenguajes compilados, que se convierten en código máquina antes de la ejecución.
Numba es una biblioteca de Python que permite compilar código Python en código máquina. Esto puede mejorar significativamente el rendimiento del código, especialmente para tareas que requieren cálculos numéricos.
En este tutorial, veremos cómo usar Numba para optimizar código Python.
Instalación
Numba está disponible en el repositorio de Python. Para instalarlo, ejecuta el siguiente comando en la terminal:
pip install numba
Uso básico
Para usar Numba, debemos marcar las funciones que queremos compilar como @numba.jit()
. Por ejemplo, el siguiente código calcula el factorial de un número:
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
Para compilar esta función con Numba, agregamos el decorador @numba.jit()
:
@numba.jit()
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
Ahora, podemos ejecutar la función:
factorial(5)
Esto devolverá el valor 120.
Mejoras de rendimiento
En general, Numba puede mejorar el rendimiento del código Python en un factor de 10 o más. Sin embargo, el grado de mejora dependerá de la naturaleza del código.
Para medir el rendimiento del código, podemos usar la biblioteca timeit
. Por ejemplo, el siguiente código mide el tiempo que tarda en ejecutarse la función factorial con y sin Numba:
import timeit
def factorial_python(n):
return factorial(n)
def factorial_numba(n):
@numba.jit()
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
return factorial(n)
print(timeit.timeit('factorial_python(5)', number=10000))
print(timeit.timeit('factorial_numba(5)', number=10000))
Este código devolverá el siguiente resultado:
2.03756103515625
0.001953125
Como podemos ver, la versión compilada con Numba es más de 100 veces más rápida que la versión interpretada.
Optimización adicional
Además de compilar el código con Numba, podemos realizar otras optimizaciones para mejorar aún más el rendimiento.
Por ejemplo, podemos usar el decorador @numba.vectorize()
para compilar código vectorizado. El código vectorizado se ejecuta sobre un conjunto de datos, lo que puede mejorar el rendimiento significativamente.
Por ejemplo, el siguiente código calcula la suma de una lista de números:
def sum_python(numbers):
return sum(numbers)
def sum_numba(numbers):
@numba.vectorize()
def sum(numbers):
return np.sum(numbers)
return sum(numbers)
numbers = [1, 2, 3, 4, 5]
print(sum_python(numbers))
print(sum_numba(numbers))
Este código devolverá el siguiente resultado:
15
15
Como podemos ver, la versión vectorizada con Numba es más rápida que la versión no vectorizada.
Conclusión
Numba es una herramienta poderosa que puede usarse para optimizar código Python. Al usar Numba, podemos mejorar significativamente el rendimiento de nuestro código, especialmente para tareas que requieren cálculos numéricos.