OPTIMIZANDO TU CÓDIGO CON NUMBA  

Descubre todas las funcionalidades de programación con Numba. Aprende cómo optimizar código Python con numba y mejora tu código con esta potente herramienta.

18/11/2020

Numba es un compilador de Python, diseñado especialmente para funciones numéricas y te permite acelerar tus funciones directamente en Python.

Numba genera código máquina optimizado a partir de Python puro usando LLVM. Con un par de cambios, puedes optimizar tu código Python y obtener una performance similar a la de C, C++ sin tener que cambiar de lenguaje de programación.

¡Puedes ver el código en mi GitHub! :)

Vamos a tratar:

  1. ¿Qué es Numba?
  2. Primeros pasos: Compilando para la CPU

 

¿Qué es Numba? 

Numba es un compilador que te permite acelerar código Python (funciones numéricas solo) usando la CPU y la GPU:

  1. Function Compiler: Numba compila solo funciones Python, no aplicaciones enteras. Básicamente, Numba es otro módulo de Python que mejora la performance de nuestras funciones.
  2. Just-in-time: (Dynamic translation) Numba trasforma el “bytecode” (código intermedio más abstracto que el código máquina) a código máquina inmediatamente antes de su ejecución.
  3. Enfocado a funciones numéricas: Numba está enfocado a datos numéricos, como int, float, complex. Hoy en día, existen limitaciones para usarlo con datos de tipo string.

Numba no es la única manera de programar en CUDA, normalmente se suele programar directamente en C, C++. Sin embargo, Numba te permite programar directamente en Python y optimizar tu código tanto para CPU como para GPU, simplemente cambiando un par de lineas de tu código. En relación a Python, existen otras alternativas tales como pyCUDA:

CUDA C/C++:

  1. Es la forma más común y flexible de programar en CUDA.
  2. Acelera aplicaciones en C y C++.

pyCUDA

  1. Es la forma más eficiente de programar en CUDA en Python.
  2. Requiere insertar código C en Python.

Numba

  1. Menos eficiente que pyCUDA.
  2. Te permite escribir tu código en Python.
  3. También optimiza el código para CPU.

Objetivos

Los objetivos de este artículo son:

  • Usar Numba para compilar y acelerar funciones usando la CPU.
  • Entender como funciona Numba
  • Acelerar funciones Numpy ufunc en GPU — Próximo artículo :)

Primeros pasos: Compilando funciones para la CPU 

Numba, a parte de acelerar tus funciones usando la GPU, puede ser usado para optimizar funciones en la CPU. Para hacer esto, simplemente usas un decorator.

Antes que nada, vamos a evaluar la función hyplot para comprobar cómo funciona Numba. Debemos usar el decorator @jit.

El resultado es el mismo que la función de Python pura, pero Numba guarda la implementación Python original en el argumento .py_func.

Benchmarking 

Como es lógico, es importante medir la performance de nuestro código, y comprobar si Numba realmente funciona y observar la diferencia entre la implementación Python y la implementación de Numba.

¡La función math.hyplot es más rápida que Numba! Esto se debe a que Numba introduce ciertos pasos cuando llamas a una función, por tanto si la función es muy simple, Numba puede hacer que tarde más que la implementación pura en Python.

¿Cómo funciona Numba? 

Cuando hemos inicializado la función hyplot:

  • IR: Representaciones intermedias
  • Bytecode Analysis: Código intermedio, más abstracto que el código máquina.
  • LLVM: Low Level Virtual Machine, infraestructura para desarrollar compiladores.
  • NVVM: Es un compilador IR basado en LLVM, está diseñado para representar kernels en GPU.

Cada línea de Python está precedida de varias líneas de código IR. Lo más útil es ver los tipos de anotaciones que muestra Numba cuando opera con las variables, por ejemplo in “pyobject”, Numba está indicando que no conoce la función np.sin y que la importa desde Python. Podemos inspeccionar los procesos para hyplot usando .inspect_types().

Ejemplo: Creando Fractales

Vamos a medir la performance de un código encargado de crear fractales usando el Conjunto de Mandelbrot y comprobar si Numba nos ayuda a optimizarlo.

Tarda alrededor de 4.64 segundos en generar un fractal usando el Conjunto de Mandelbrot, ahora vamos a ver si Numba mejora la performance, para ello debemos usar el decorador @jit.

Podemos ver cómo hemos reducido el tiempo de 4.62 segundos a 52.4 ms… y esto ha sido hecho solo con añadir un decorador.

 

Algunos errores comunes

Hemos dicho que Numba solo funciona con funciones numéricas, aunque Numba compila y ejecuta código Python, hay algunos tipos de dato que no puede compilar todavía (como los diccionarios).

Sin embargo, en el ejemplo anterior vemos como no ha fallado!! Hemos dicho que Numba no compila diccionarios… El punto aquí es que Numba crea 2 funciones, una para Python y otra para Numba. Por tanto, aquí estamos observando la solución de Python, podemos comprobarlo añadiendo nopython = True.

jit(nopython = True) es equivalente a njit

Conclusión

En resumen, Numba es compilador de Python, diseñado especialmente para funciones numéricas y te permite acelerar tus aplicaciones directamente en Python.

Es una herramienta estable y que mejora la performance de nuestras funciones numéricas simplemente añadiendo un decorator. Además es muy potente ya que tiene cientos de usos y nos permite mejorar y ahorrar tiempo a la hora de ejecutar nuestro código.

¿Quiénes somos?

Si quieres aprender a desarrollar aplicaciones para el mundo real o a manejar grandes cantidades de datos, podrías estar interesado en nuestro Máster de Data Science . No sólo adquirirás todos los conocimientos técnicos necesarios para construir tu futuro como Data Science del mejor equipo, sino que también disfrutarás descubriendo la dimensión humana de los datos. Para obtener más información, haga click aquí.


Este artículo ha sido escrito por: Alejandro Díaz Santos — (LinkedIn, GitHub) para IMMUNE Technology Institute.

Relacionadas

¿QUÉ QUIERES SER DE MAYOR?
Sin categorizar
01/01/2021

¿QUÉ QUIERES SER DE MAYOR?

Un año más ha llegado septiembre. Y, un año más, miles y miles de adolescentes tendrán que volver a hacerse la eterna pregunta. “¿Qué quiero estudiar? ¿Qué quiero ser de mayor?”. Las dos son preguntas con las que bombardeamos a los jóvenes desde su infancia.

¿Cómo pueden encontrarme las empresas?
Sin categorizar
09/09/2020

¿Cómo pueden encontrarme las empresas?

10 MUJERES QUE LIDERAN LA EDUCACIÓN STEM
Sin categorizar
01/01/2021

10 MUJERES QUE LIDERAN LA EDUCACIÓN STEM

La educación y el sector laboral STEM parecen estar liderados por los hombres. Tan solo el 16% de las mujeres se matriculan en estudios universitarios de ciencia, tecnología, ingeniería y matemáticas

EL FUTURO DE LOS INCONFORMISTAS
Sin categorizar
01/01/2021

EL FUTURO DE LOS INCONFORMISTAS

Cada vez son más las personas que buscan una alternativa al incierto mercado laboral y que apuestan por crear su propia empresa. En 2017, se llegaron a registrar en nuestro país un total de 3.258 startups frente a las 2.663 del año anterior.