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

Antecedentes: acabo de comenzar con scikit-learn y leo en la parte inferior de la página sobre joblib, en lugar de pickle .

puede ser más interesante utilizar el reemplazo de pickle de joblib (joblib.dump & joblib.load), que es más eficiente en big data, pero solo puede pickle al disco y no a una cadena

Leí estas preguntas y respuestas sobre Pickle, Casos de uso comunes para pickle en Python y me pregunto si la comunidad de aquí puede compartir las diferencias entre joblib y pickle. ¿Cuándo se debe usar uno sobre el otro?

Por lo general, joblib es significativamente más rápido en matrices de gran tamaño porque tiene un manejo especial para los buffers de matriz de la estructura de datos de numpy. Para obtener información sobre los detalles de la implementación, puede consultar el código fuente . También puede comprimir esos datos sobre la marcha mientras decapos con zlib o lz4.

joblib también hace posible la asignación de memoria del búfer de datos de una matriz numpy decapada joblib sin compresión al cargarla, lo que hace posible compartir la memoria entre procesos.

Tenga en cuenta que si no selecciona matrices de números grandes, entonces las salmueras normales pueden ser significativamente más rápidas, especialmente en grandes colecciones de objetos pequeños de Python (por ejemplo, una gran cantidad de objetos str) porque el módulo de salmuera de la biblioteca estándar se implementa en C mientras joblib es puro python.

Tenga en cuenta que una vez que PEP 574 (Pickle protocol 5) se fusione (esperemos que para Python 3.8), será mucho más eficiente seleccionar grupos de grandes números utilizando la biblioteca estándar.

joblib podría seguir siendo útil para cargar objetos que tienen arrays numpy nesteds en modo mapeado de memoria con mmap_mode="r" sin embargo.

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) ya que 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 

De acuerdo con esto, joblib funciona mejor que los módulos cPickle y Pickle de estos 3 módulos. Gracias