Tip: Puedes ver este post en GitHub o ejecutarlo en Binder o Google Colab, pulsa el icono.

Fuentes:
joblib

Principales usos

  • Ejecución de funciones de forma paralela en distintos procesadores
  • Archivo de objetos en disco para su posterior uso
  • Archivo en disco del resultado de una función.

Instalar: pip install joblib

1- Ejecución de funciones de forma paralela en distintos procesadores

import time
from joblib import Parallel, delayed
def funcion_ejemplo(x):
    tiempo=time.perf_counter()
    print(f" Espera {x} segundo(s).")
    time.sleep(x)  
    print(f" Espera terminada.")
    return x

Si llamamos a la función varias veces se ejcutarán secuencialmente una tras otra.

tiempo=time.perf_counter()
funcion_ejemplo(1)
funcion_ejemplo(1)
funcion_ejemplo(1)
print(f"Tiempo transcurrido {round(time.perf_counter()-tiempo,2)} segundos")
 Espera 1 segundo(s).
 Espera terminada.
 Espera 1 segundo(s).
 Espera terminada.
 Espera 1 segundo(s).
 Espera terminada.
Tiempo transcurrido 3.0 segundos

Utilizando joblib podemos distribuir la ejecución entre los distintos procesadores de nuestro PC.

tiempo=time.perf_counter()

Parallel(n_jobs=3, backend="multiprocessing")(delayed(funcion_ejemplo)(1) for i in range(3))

print(f"Tiempo transcurrido {round(time.perf_counter()-tiempo,2)} segundos")
 Espera 1 segundo(s). Espera 1 segundo(s). Espera 1 segundo(s).


 Espera terminada. Espera terminada. Espera terminada.


Tiempo transcurrido 1.05 segundos

Para especificar el tipo de paralelización escoger para backend

  • multiprocessing
  • threading

2- Archivo de objetos en disco para su posterior uso

Almacena objetos de cualquier tipo de manera eficiente incluso los de gran tamaño.

import joblib
objeto_a_archivar = {1: 'lunes', 2: 'martes', 3: 'miércoles', 4: 'jueves', 5: 'viernes', 6: 'sábado', 7: 'domingo'}

Almacenar:

joblib.dump(objeto_a_archivar,"nombre_archivo.obj")  # usar cualquier extensión que se desee

Recuperar:

objeto_recuperado = joblib.load ("nombre_archivo.obj")
objeto_recuperado

3- Archivo en disco del resultado de una función

Establecer el directorio donde se guardará. Creará una carpeta llamada 'joblib':

cachedir = '.'   #  '.' significa el mismo directorio, especificar el que se desee

Iniciar el contexto de memoria:

from joblib import Memory  
memoria = Memory(cachedir, verbose=0)
@memoria.cache
def funcion(x):
    tiempo=time.perf_counter()
    print(f" Espera {x} segundos")
    time.sleep(x)  
    print(f" He esperado {round(time.perf_counter()-tiempo,2)} segundos")
    return x
    

La primera vez ejecuta la función y almacena en la caché el resultado

funcion(3)
 Espera 3 segundos
 He esperado 3.0 segundos
3

Llamando a la función por segunda vez con el mismo argumento devuelve el resultado sin ejecutarla

funcion(3)
3

Para borrar la memoria almacenada

memoria.clear()
WARNING:root:[Memory(location=./joblib)]: Flushing completely the cache
funcion(3)
 Espera 3 segundos
 He esperado 3.0 segundos
3