web-dev-qa-db-fra.com

Quels sont les différents cas d'utilisation du joblib par rapport au cornichon?

Contexte: Je viens de commencer avec scikit-learn, et lisez au bas de la page sur joblib, versus pickle .

il peut être plus intéressant d'utiliser le remplacement de pickle de joblib (joblib.dump & joblib.load), qui est plus efficace sur les mégadonnées, mais ne peut pickler que sur le disque et non sur une chaîne

J'ai lu cette Q&R sur Pickle, Cas d'utilisation courants pour cornichon en Python et je me demande si la communauté ici peut partager les différences entre joblib et cornichon? Quand faut-il utiliser l'un sur l'autre?

44
msunbot

joblib est généralement beaucoup plus rapide sur les grands tableaux numpy car il a un traitement spécial pour les tampons de tableau de la structure de données numpy. Pour en savoir plus sur les détails de l'implémentation, vous pouvez consulter le code source . Il peut également compresser ces données à la volée lors du décapage à l'aide de zlib ou lz4.

joblib permet également de mapper en mémoire le tampon de données d'un tableau numpy décompressé par joblib lors du chargement, ce qui permet de partager la mémoire entre les processus.

Notez que si vous ne décapez pas de grands tableaux numpy, le décapage ordinaire peut être beaucoup plus rapide, en particulier sur les grandes collections de petits objets python (par exemple, un grand dict d'objets str)) car le module pickle de la bibliothèque standard est implémentée en C tandis que joblib est en python pur.

Notez qu'une fois que PEP 574 (protocole Pickle 5) est fusionné (espérons-le pour Python 3.8), il sera beaucoup plus efficace de décaper de grands tableaux numpy en utilisant la bibliothèque standard.

joblib peut toujours être utile pour charger des objets qui ont des tableaux numpy imbriqués en mode mappé en mémoire avec mmap_mode="r" bien que.

49
ogrisel

Merci à Gunjan de nous avoir donné ce script! Je l'ai modifié pour les résultats 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
11
Michael Mano

Je suis tombé sur la même question, j'ai donc essayé celle-ci (avec Python 2.7) car j'ai besoin de charger un gros fichier de cornichons

#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 sortie pour cela est

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

Selon ce joblib fonctionne mieux que le module cPickle et Pickle de ces 3 modules. Merci

5
Gunjan