Каковы различные варианты использования joblib против рассола? - программирование
Подтвердить что ты не робот

Каковы различные варианты использования joblib против рассола?

Фон: я только начинаю с scikit-learn и читаю в нижней части страницы о joblib, против pickle.

может быть интереснее использовать joblibs замену pickle (joblib.dump и joblib.load), который более эффективен для больших данных, но может только рассортировать диск, а не строку

Я прочитал этот Q & A на Pickle, Обычные прецеденты для рассола в Python и интересно, может ли сообщество разделять различия между joblib и pickle? Когда нужно использовать один над другим?

4b9b3361

Ответ 1

joblib обычно значительно быстрее на больших массивах numpy, потому что он имеет специальную обработку для буферов массивов структуры numpy. Чтобы узнать о деталях реализации, вы можете взглянуть на исходный код. Он также может сжимать эти данные на лету при травлении с использованием zlib или lz4.

Кроме того, joblib позволяет отображать в памяти буфер данных несжатого массива с зарезанным отбеливателем при загрузке, что позволяет распределять память между процессами.

Обратите внимание, что если вы не выбираете большие массивы numpy, то обычное pickle может быть значительно быстрее, особенно в больших коллекциях небольших объектов python (например, большой набор объектов str), потому что модуль pickle стандартной библиотеки реализован в C, в то время как joblib - это чистый питон.

Обратите внимание, что после слияния PEP 574 (протокол Pickle 5) (надеюсь, для Python 3.8) будет гораздо эффективнее выбирать большие массивы с использованием стандартной библиотеки.

joblib все еще может быть полезен для загрузки объектов, которые имеют вложенные массивы в режиме отображения памяти, с помощью mmap_mode="r".

Ответ 2

Спасибо Gunjan за предоставленный нам этот сценарий! Я изменил его для результатов 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

Ответ 3

Я столкнулся с тем же вопросом, поэтому я попробовал этот (с Python 2.7), так как мне нужно загрузить большой файл рассола

#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

Выход для этого

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

В соответствии с этим joblib работает лучше, чем модули cPickle и Pickle из этих 3 модулей. Спасибо