Saltar al contenido

¿Cuáles son los diferentes casos de uso de joblib versus pickle?

Necesitamos tu ayuda para difundir nuestros artículos sobre las ciencias de la computación.

Solución:

  • joblib suele ser significativamente más rápido en grandes matrices numpy porque tiene un manejo especial para el array búferes de la estructura de datos numpy. Para conocer los detalles de implementación, puede echar un vistazo al código fuente. También puede comprimir esos datos sobre la marcha mientras se decapa con zlib o lz4.
  • joblib también hace posible el mapeo de memoria el búfer de datos de un numpy encurtido en joblib sin comprimir array al cargarlo lo que hace posible compartir memoria entre procesos.
  • si no selecciona matrices grandes y numpy, entonces la selección regular puede ser significativamente más rápida, especialmente en grandes colecciones de objetos pequeños de Python (por ejemplo, un dictado grande de objetos str) porque el módulo pickle de la biblioteca estándar se implementa en C, mientras que joblib es Python puro.
  • Dado que PEP 574 (Protocolo Pickle 5) se ha fusionado en Python 3.8, ahora es mucho más eficiente (en cuanto a memoria y CPU) para decapar matrices grandes y numpy usando la biblioteca estándar. Las matrices grandes en este contexto significan 4 GB o más.
  • Pero joblib aún puede ser útil con Python 3.8 para cargar objetos que tienen matrices numpy anidadas en modo mapeado de memoria con mmap_mode="r".

¡Gracias a Gunjan por darnos este guión! Lo modifiqué para los resultados de Python3.

#comapare pickle loaders
from time import time
import pickle
import os
import _pickle as cPickle
from sklearn.externals import joblib

file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'database.clf')
t1 = time()
lis = []
d = pickle.load(open(file,"rb"))
print("time for loading file size with pickle", os.path.getsize(file),"KB =>", time()-t1)

t1 = time()
cPickle.load(open(file,"rb"))
print("time for loading file size with cpickle", os.path.getsize(file),"KB =>", time()-t1)

t1 = time()
joblib.load(file)
print("time for loading file size joblib", os.path.getsize(file),"KB =>", time()-t1)

time for loading file size with pickle 79708 KB => 0.16768312454223633
time for loading file size with cpickle 79708 KB => 0.0002372264862060547
time for loading file size joblib 79708 KB => 0.0006849765777587891

Me encontré con la misma pregunta, así que probé esta (con Python 2.7) porque necesito cargar un archivo pickle grande

#comapare pickle loaders
from time import time
import pickle
import os
try:
   import cPickle
except:
   print "Cannot import cPickle"
import joblib

t1 = time()
lis = []
d = pickle.load(open("classi.pickle","r"))
print "time for loading file size with pickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1

t1 = time()
cPickle.load(open("classi.pickle","r"))
print "time for loading file size with cpickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1

t1 = time()
joblib.load("classi.pickle")
print "time for loading file size joblib", os.path.getsize("classi.pickle"),"KB =>", time()-t1

La salida para esto es

time for loading file size with pickle 1154320653 KB => 6.75876188278
time for loading file size with cpickle 1154320653 KB => 52.6876490116
time for loading file size joblib 1154320653 KB => 6.27503800392

Según este joblib, funciona mejor que el módulo cPickle y Pickle de estos 3 módulos. Gracias

Reseñas y valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *