142 votes

Quels sont les différents cas d'utilisation de joblib par rapport à pickle ?

Le contexte : Je commence tout juste à utiliser scikit-learn, et j'ai lu en bas de la page à propos de joblib, versus pickle .

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

J'ai lu cette question-réponse sur Pickle, Cas d'utilisation courants de pickle en Python et je me demande si la communauté ici peut partager les différences entre joblib et pickle ? Quand faut-il utiliser l'un plutôt que l'autre ?

179voto

ogrisel Points 13211
  • joblib est généralement beaucoup plus rapide sur les grands tableaux numpy. car il a une gestion spéciale des tampons de tableau de la structure de données numpy. Pour connaître les détails de l'implémentation, vous pouvez jeter un coup d'œil à la page code source . Il peut également compresser ces données à la volée pendant le décapage en utilisant zlib ou lz4.
  • joblib permet également d'établir une carte mémoire le tampon de données d'un tableau numpy non compressé par joblib lors de son chargement, ce qui permet de partager la mémoire entre les processus.
  • si vous ne récupérez pas de grands tableaux numpy, alors la récupération normale peut être significativement plus rapide, en particulier pour les grandes collections de petits objets python. (par exemple, un grand dict d'objets str) parce que le module pickle de la bibliothèque standard est implémenté en C alors que joblib est du pur python.
  • Depuis que le PEP 574 (protocole Pickle 5) a été intégré à Python 3.8, il est maintenant beaucoup plus efficace (en termes de mémoire et de processeur) de récupérer de grands tableaux numpy en utilisant la bibliothèque standard. Dans ce contexte, un grand tableau signifie 4 Go ou plus.
  • Pero joblib peut encore être utile avec Python 3.8 pour charger des objets qui ont des tableaux numpy imbriqués. en mode mappé mémoire avec mmap_mode="r" .

12voto

Michael Mano Points 758

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

9voto

Gunjan Points 255

J'ai rencontré la même question et j'ai essayé celle-ci (avec Python 2.7) car j'ai besoin de charger un gros fichier pickle.

#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

D'après cela, joblib fonctionne mieux que cPickle et le module Pickle de ces 3 modules. Merci

-2voto

Borkostolo Points 9

Juste une humble remarque ... Pickle est meilleur pour les estimateurs scikit-learn adaptés / modèles formés. Dans les applications ML, les modèles formés sont sauvegardés et rechargés pour la prédiction principalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X