web-dev-qa-db-ja.com

joblibとpickleの異なるユースケースは何ですか?

背景:私はscikit-learnを始めたばかりで、ページの下部で joblib、vs pickle について読んでいます。

joblibのpickleの置き換え(joblib.dump&joblib.load)を使用する方が興味深い場合があります。これは、ビッグデータではより効率的ですが、文字列ではなくディスクにのみpickleできます

このQ&AをPickleで読んだ Pythonのpickleの一般的な使用例 ここでコミュニティがjoblibとpickleの違いを共有できるかどうか疑問に思いますか?いつ他の人を使用する必要がありますか?

44
msunbot

joblibは、numpyデータ構造の配列バッファーを特別に処理するため、大きなnumpy配列では通常かなり高速です。実装の詳細については、 ソースコード をご覧ください。また、zlibまたはlz4を使用して酸洗いする際に、そのデータをオンザフライで圧縮できます。

joblibは、ロード時に非圧縮のjoblibでピックされたnumpy配列のデータバッファーをメモリマップすることも可能にします。これにより、プロセス間でメモリを共有できます。

大きなnumpy配列をpickle化しない場合、標準のpickleモジュールは特に小さいpythonオブジェクトの大きなコレクション(strオブジェクトの大きな辞書など)で、通常のpickleが大幅に高速化できることに注意してください。ライブラリはCで実装され、joblibは純粋なpythonです。

PEP 574(Pickleプロトコル5)がマージされると(Python 3.8の場合)、標準ライブラリを使用して大きなnumpy配列をピクルする方がはるかに効率的であることに注意してください。

joblibは、mmap_mode="r"を使用して、メモリマップモードでnumpy配列をネストしたオブジェクトをロードするのにまだ有用かもしれません。

49
ogrisel

このスクリプトを提供してくれた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
11
Michael Mano

私は同じ質問に出くわしたので、大きなピクルファイルをロードする必要があるため、これを(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によると、これら3つのモジュールのcPickleおよびPickleモジュールよりもうまく機能します。ありがとう

5
Gunjan