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

IMPACTFUL TECH: EL PUNTO DE ENCUENTRO DE PROFESIONALES Y EXPERTOS DEL SECTOR
Sin categorizar
26/04/2019

IMPACTFUL TECH: EL PUNTO DE ENCUENTRO DE PROFESIONALES Y EXPERTOS DEL SECTOR

El pasado mes de marzo IMMUNE Coding Institute dio el pistoletazo de salida a la iniciativa Impactful Tech, un ciclo de conferencias y debates donde profesionales y expertos de diferentes sectores analizan los aspectos clave de la transformación tecnológica.

SE NECESITAN URGENTEMENTE EXPERTOS EN CIBERSEGURIDAD
Sin categorizar
15/02/2019

SE NECESITAN URGENTEMENTE EXPERTOS EN CIBERSEGURIDAD

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ac consequat risus. Nulla at magna diam. Fusce aliquet eros purus, in porta nisl feugiat semper.

¿SABES CUÁL ES EL LENGUAJE FAVORITO DE LOS PROGRAMADORES?
Sin categorizar
16/06/2019

¿SABES CUÁL ES EL LENGUAJE FAVORITO DE LOS PROGRAMADORES?

Nos comunicamos, trabajamos y cocinamos, entre otras muchas tareas, con aparatos que han sido programados para ayudarnos en nuestro día a día. Para diseñar estos dispositivos, establecer sus funciones y hacer que respondan a lo que necesitamos, se utilizan varios lenguajes de programación

NUEVAS TECNOLOGÍAS, LEGALIDAD Y HUMANOS: CLAVES EN LA CIBERSEGURIDAD
Sin categorizar
06/03/2019

NUEVAS TECNOLOGÍAS, LEGALIDAD Y HUMANOS: CLAVES EN LA CIBERSEGURIDAD

La llegada de internet a nuestro día a día y a las organizaciones ha provocado que nuestros datos y cierta información sensible, o confidencial, esté en peligro. Los robos masivos de datos están a la orden del día y nadie está a salvo: ni empresas, ni gobiernos ni ciudadanos de a pie.