joblib와 pickle의 다른 사용 사례는 무엇입니까?


85

배경 : 저는 이제 막 scikit-learn을 시작하고 있으며 페이지 하단에서 joblib와 pickle에 대해 읽었습니다 .

joblib의 pickle (joblib.dump & joblib.load) 대체를 사용하는 것이 더 흥미로울 수 있습니다.

저는 Pickle에 대한이 Q & A, Python의 pickle에 대한 일반적인 사용 사례를 읽고 여기 커뮤니티가 joblib와 pickle의 차이점을 공유 할 수 있는지 궁금합니다. 언제 다른 것을 사용해야합니까?

답변:


96
  • joblib는 일반적으로 numpy 데이터 구조의 배열 버퍼에 대한 특수 처리가 있기 때문에 큰 numpy 배열에서 훨씬 더 빠릅니다 . 구현 세부 사항에 대해 알아 보려면 소스 코드를 참조하십시오 . 또한 zlib 또는 lz4를 사용하여 피클 링하는 동안 데이터를 즉시 압축 할 수 있습니다.
  • joblib는 또한 로드 할 때 압축되지 않은 joblib-pickled numpy 배열의 데이터 버퍼 를 메모리 매핑 할 수있게하여 프로세스간에 메모리를 공유 할 수 있도록합니다.
  • 큰 numpy 배열을 피클하지 않으면 표준 라이브러리의 피클 모듈이 C에서 구현되는 동안 joblib가 구현되기 때문에 특히 작은 Python 개체의 대규모 컬렉션 (예 : str 개체의 큰 dict)에서 일반 피클이 훨씬 더 빠를 수 있습니다. 순수한 파이썬.
  • PEP 574 (Pickle 프로토콜 5)가 Python 3.8에 병합되었으므로 이제 표준 라이브러리를 사용하여 큰 numpy 배열을 피클하는 것이 훨씬 더 효율적입니다 (메모리 측면 및 CPU 측면). 이 맥락에서 대형 어레이는 4GB 이상을 의미합니다.
  • 그러나 JOBLIB는 여전히 중첩 된 NumPy와 배열이 개체를로드 할 수 파이썬 3.8에 유용 할 수 있습니다 메모리와 함께 모드를 매핑을 mmap_mode="r".

1
감사합니다! 이것은 도움이됩니다.
msunbot 2012 년

2
그것은 우리가 사용하는 것을 의미합니까 Joblib이상 Pickle? Joblib우리가 고려해야 할 단점이 있습니까? Joblib최근에 들어 본 적이 있는데 흥미로울 것 같습니다.
Catbuilts

2
표준 라이브러리에서 발생하는 단점과 새로운 사항으로 답변을 업데이트했습니다.
ogrisel

2
joblib는 구문 분석을 해제하는 동안 임의의 코드도 실행합니까? (Unsafe)
Mr-Programs

이것은 모든 "참고 사항 ..."을 읽고 한 줄 요약을 얻기가 어렵습니다 . joblib는 3.8에서 큰 numpy 배열을 작성하는 데 X 배 더 빠릅니다. 대략 X는 무엇입니까? 읽고? 그리고 pickle은 많은 작은 파이썬 객체를 작성하는 데 대략 Y 배 더 빠릅니다. Y는 무엇입니까? 읽고? 또한 상대 압축 비율 / 파일 크기는 어떻게됩니까?
smci

12

이 스크립트를 제공해 주신 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

Gunjan은 1154320653KB의 피클 파일을 사용했습니다. 더 큰 파일이 joblib에 유리한 차이를 만들 수 있습니까?
guiferviz

2
성능 수치를 표시 할 때 항상 Python 버전을 알려주십시오. 2.6? 2.7? 3.6? 3.7? 더 나은 방법은 joblib 대 pickle 대 cPickle의 상대 숫자를보고하는 것입니다. 또한 Gunjan의 실수로 1.1TB가 아닌 1.1GB 수정
smci

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에 따르면이 3 개 모듈의 cPickle 및 Pickle 모듈보다 더 잘 작동합니다. 감사


2
cpickle이 pickle보다 빨라야한다고 생각 했나요?
Echo

이 벤치 마크는 기본적으로 pickle (protocol = 3)을 사용하는 python 3으로 수행됩니까 (python2의 기본값보다 빠름)?
LearnOPhile

3
os.path.getsize는 킬로바이트가 아닌 바이트를 반환하므로 약 1,1GB의 파일에 대해 이야기하고 있습니다 (출력에서 보이는 것처럼
1,1TB가

이것은 훌륭하지만 1.1TB가 아닌 1.1GB를 반영하도록 출력을 수정하십시오. joblib, pickle 및 cPickle의 경우 Python 버전 3.6, 3.7, 3.8 및 2.7의 경우 1KB ... 10GB에서 10의 거듭 제곱으로 파일 크기에 대한 비교 숫자를 그리는 것이 더 좋습니다.
smci
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.