Was sind die unterschiedlichen Anwendungsfälle von Joblib gegenüber Pickle?

81

Hintergrund: Ich fange gerade erst mit Scikit-Learn an und lese am Ende der Seite über Joblib im Vergleich zu Pickle .

Es kann interessanter sein, Joblibs Ersatz für pickle (joblib.dump & joblib.load) zu verwenden, der für Big Data effizienter ist, aber nur auf der Festplatte und nicht auf einer Zeichenfolge pickle

Ich habe diese Fragen und Antworten zu Pickle, den häufigsten Anwendungsfällen für Pickle in Python gelesen und mich gefragt, ob die Community hier die Unterschiede zwischen Joblib und Pickle teilen kann. Wann sollte man einen über den anderen verwenden?

msunbot
quelle

Antworten:

90
  • joblib ist in der Regel bei großen Numpy-Arrays erheblich schneller, da die Array-Puffer der Numpy-Datenstruktur speziell behandelt werden. Informationen zu den Implementierungsdetails finden Sie im Quellcode . Es kann diese Daten auch im laufenden Betrieb komprimieren, während mit zlib oder lz4 gebeizt wird.
  • joblib ermöglicht es auch, den Datenpuffer eines unkomprimierten, von joblib ausgewählten numpy-Arrays beim Laden zuzuordnen, wodurch der Speicher zwischen Prozessen gemeinsam genutzt werden kann.
  • Wenn Sie keine großen Numpy-Arrays auswählen, kann die reguläre Auswahl erheblich schneller sein, insbesondere bei großen Sammlungen kleiner Python-Objekte (z. B. einem großen Diktat von str-Objekten), da das Auswahlmodul der Standardbibliothek in C implementiert ist, während joblib ausgeführt wird reine Python.
  • Da PEP 574 (Pickle-Protokoll 5) in Python 3.8 zusammengeführt wurde, ist es jetzt viel effizienter (speicher- und CPU-weise), große numpy-Arrays mithilfe der Standardbibliothek zu pickeln. Große Arrays bedeuten in diesem Zusammenhang 4 GB oder mehr.
  • Aber JOBLIB kann immer noch nützlich sein , mit Python 3.8 Objekte zu laden , die verschachtelte numpy Arrays im Speicher abgebildet Modus mit mmap_mode="r".
Ogrisel
quelle
1
Danke vielmals! Das ist hilfreich.
Msunbot
1
Bedeutet es , dass wir verwenden sollten Joblibüber Pickle? Welche Nachteile Joblibsollten wir berücksichtigen? Ich habe gerade davon gehört Joblibund es klingt für mich interessant.
Catbuilts
1
Ich habe meine Antwort mit Nachteilen und neuen Dingen in der Standardbibliothek aktualisiert.
Ogrisel
2
Führt joblib beim Entparsen auch beliebigen Code aus? (Unsicher)
Mr-Programs
Dies ist schwer zu lesen, alle "Beachten Sie, dass ..." und erhalten Sie die einzeilige Zusammenfassung: Joblib ist X-mal schneller, um große numpy Arrays in 3.8 zu schreiben, ungefähr was ist X? und zu lesen? und pickle ist ungefähr Y-mal schneller, um viele kleine Python-Objekte zu schreiben. Was ist Y? und zu lesen? Wie hoch sind auch die relativen Komprimierungsverhältnisse / Dateigrößen?
smci
12

Vielen Dank an Gunjan, der uns dieses Skript gegeben hat! Ich habe es für Python3-Ergebnisse geändert

#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
Michael Mano
quelle
Gunjan verwendete eine 1154320653 KB Pickle-Datei. Könnte eine größere Datei einen Unterschied zugunsten von joblib bewirken?
Guiferviz
Bitte, bitte, bitte geben Sie immer Ihre Python-Version an, wenn Sie Leistungszahlen anzeigen. 2,6? 2,7? 3,6? 3,7? Besser noch, melden Sie die relativen Zahlen joblib vs pickle vs cPickle. Beheben Sie außerdem Gunjans Fehler von 1,1 GB und nicht 1,1 TB
smci
8

Ich bin auf dieselbe Frage gestoßen, also habe ich diese (mit Python 2.7) ausprobiert, da ich eine große Pickle-Datei laden muss

#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

Ausgabe dafür ist

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

Demnach funktioniert die Joblib besser als das cPickle and Pickle-Modul dieser 3 Module. Vielen Dank

Gunjan
quelle
1
Ich dachte, cpickle sollte schneller sein als pickle?
Echo
Wird dieser Benchmark mit Python 3 durchgeführt, das standardmäßig pickle (Protokoll = 3) verwendet (was schneller ist als der Standard in Python2)?
LearnOPhile
3
os.path.getsize gibt Bytes zurück, nicht Kilobyte, also sprechen wir von einer Datei mit ungefähr 1,1 GB (und nicht 1,1 TB, wie es aus der Ausgabe hervorgeht)
Vlad Iliescu
Das ist großartig, aber bitte korrigieren Sie die Ausgabe so, dass sie 1,1 GB und nicht 1,1 TB beträgt. Besser noch wäre es, Vergleichszahlen für Dateigrößen in Zehnerpotenzen von 1 KB ... 10 GB für Python-Versionen 3.6, 3.7, 3.8 und 2.7 für Joblib, Pickle und cPickle zu zeichnen.
smci