Які різні випадки використання йоблібу проти соління?


85

Довідкова інформація: Я лише починаю роботу з scikit-learn і читаю внизу сторінки про joblib проти соління .

може бути цікавіше використовувати заміну розсоління joblib (joblib.dump & joblib.load), яка є більш ефективною для великих даних, але може розсолити лише диск, а не рядок

Я читаю ці запитання щодо Pickle, типових випадків використання маринованих окулярів у Python і цікавлюсь, чи може спільнота тут поділитися різницею між joblib та pickle? Коли слід використовувати одне над іншим?

Відповіді:


96
  • joblib зазвичай значно швидший у великих масивах numpy, оскільки він має спеціальну обробку для буферів масивів структури numpy. Щоб дізнатись про деталі реалізації, ви можете поглянути на вихідний код . Він також може стискати ці дані на льоту під час травлення за допомогою zlib або lz4.
  • joblib також дає змогу відобразити в пам'яті буфер даних нестисненого масиву numpy, вибраного joblib, під час його завантаження, що дозволяє спільно використовувати пам'ять між процесами.
  • якщо ви не маринуєте великі масиви numpy, то звичайне маринування може бути значно швидшим, особливо на великих колекціях невеликих об'єктів python (наприклад, великий dict об'єктів str), оскільки модуль pickle стандартної бібліотеки реалізований в C, тоді як joblib є чистий пітон.
  • оскільки PEP 574 (протокол Pickle 5) був об’єднаний в Python 3.8, тепер набагато ефективніше (з точки зору пам'яті та процесора) маринувати великі масиви numpy за допомогою стандартної бібліотеки. Великі масиви в цьому контексті означають 4 ГБ або більше.
  • Але joblib все ще може бути корисним з Python 3.8 для завантаження об'єктів, що мають вкладені масиви numpy в режимі відображення пам'яті mmap_mode="r".

1
Дуже дякую! Це корисно.
msunbot

2
Чи означає це, що ми повинні використовувати Joblibнад Pickle? Будь-які мінуси, Joblibякі ми повинні врахувати? Я нещодавно чув про Joblibце, і це для мене звучить цікаво.
Catbuilts

2
Я оновив свою відповідь мінусами та новинками, що відбуваються у стандартній бібліотеці.
ogrisel

2
Чи виконує joblib також довільний код під час розпаркування? (Небезпечно)
Mr-Programs

Це важко прочитати через "Зверніть увагу на те, що ..." і отримати однорядковий підсумок: joblib у X рази швидше пише великі масиви numpy в 3.8, приблизно що таке X? а читати? і Pickle приблизно в Y рази швидше пише багато маленьких об’єктів Python, що таке Y? а читати? Крім того, які відносні коефіцієнти стиснення / розміри файлів?
smci

12

Дякуємо Гуньяну, що дав нам цей сценарій! Я змінив його для результатів 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

Гуньян використав файл засолення розміром 1154320653 КБ. Чи може більший файл змінити ситуацію на користь joblib?
guiferviz

2
Будь ласка, будь ласка, завжди вказуйте свою версію Python, показуючи показники продуктивності. 2,6? 2,7? 3,6? 3,7? А ще краще, повідомте відносні цифри joblib vs pickle vs cPickle. Крім того, виправте помилку
Гунджана

8

Я натрапив на те саме запитання, тому спробував це (з 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 модулів. Дякую


2
Я думав, cpickle повинен бути швидшим, ніж маринований?
Відлуння

Чи виконується цей орієнтир з python 3, який за замовчуванням використовує pickle (protocol = 3) (що швидше, ніж за замовчуванням у python2)?
LearnOPhile

3
os.path.getsize повертає байти, а не кілобайти, тому ми говоримо про файл розміром приблизно 1,1 ГБ (а не 1,1 ТБ, як це виглядає з вихідних даних)
Влад Ілієску,

Це чудово, але, будь ласка, виправте вихід, щоб відображати, що це 1,1 ГБ, а не 1,1 ТБ. Ще краще було б побудувати порівняльні номери для розмірів файлів у степенях-10 від 1 КБ ... 10 ГБ, для версій Python 3.6, 3.7, 3.8 та 2.7, для joblib, pickle та cPickle.
smci
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.