Joblib: paralelización y archivo de objetos en Python de forma fácil
Guía rápida de uso de la librería
Tip: Puedes ver este post en GitHub o ejecutarlo en Binder o Google Colab, pulsa el icono.
Fuentes:
joblib
Instalar: pip install joblib
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")
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")
Para especificar el tipo de paralelización escoger para backend
- multiprocessing
- threading
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
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)
Llamando a la función por segunda vez con el mismo argumento devuelve el resultado sin ejecutarla
funcion(3)
Para borrar la memoria almacenada
memoria.clear()
funcion(3)