Các trường hợp sử dụng khác nhau của joblib so với pickle là gì?


81

Thông tin cơ bản: Tôi chỉ mới bắt đầu với scikit-learning và đọc ở cuối trang về joblib, so với pickle .

có thể thú vị hơn khi sử dụng việc thay thế pickle (joblib.dump & joblib.load) của joblib, hiệu quả hơn trên dữ liệu lớn, nhưng chỉ có thể đưa vào đĩa chứ không phải chuỗi

Tôi đã đọc phần Hỏi & Đáp này về Pickle, Các trường hợp sử dụng phổ biến cho dưa muối trong Python và tự hỏi liệu cộng đồng ở đây có thể chia sẻ sự khác biệt giữa joblib và dưa chua không? Khi nào thì nên sử dụng cái này thay cho cái khác?

Câu trả lời:


91
  • joblib thường nhanh hơn đáng kể trên các mảng numpy lớn vì nó có cách xử lý đặc biệt đối với các vùng đệm mảng của cơ cấu dữ liệu numpy. Để tìm hiểu về chi tiết triển khai, bạn có thể xem mã nguồn . Nó cũng có thể nén dữ liệu đó khi đang di chuyển bằng cách sử dụng zlib hoặc lz4.
  • joblib cũng làm cho nó có thể ánh xạ bộ nhớ đệm dữ liệu của một mảng numpy chọn joblib không được nén khi tải nó, giúp có thể chia sẻ bộ nhớ giữa các tiến trình.
  • nếu bạn không chọn các mảng numpy lớn, thì quá trình chọn thông thường có thể nhanh hơn đáng kể, đặc biệt là trên các bộ sưu tập lớn của các đối tượng python nhỏ (ví dụ: một lệnh lớn của các đối tượng str) vì mô-đun pickle của thư viện chuẩn được triển khai trong C trong khi joblib cao trăn nguyên chất.
  • kể từ khi PEP 574 (giao thức Pickle 5) đã được hợp nhất trong Python 3.8, giờ đây sẽ hiệu quả hơn nhiều (khôn ngoan về bộ nhớ và thông minh về cpu) để chọn các mảng lớn bằng thư viện chuẩn. Mảng lớn trong ngữ cảnh này có nghĩa là 4GB trở lên.
  • Nhưng joblib vẫn có thể hữu ích với Python 3.8 để tải các đối tượng có các mảng numpy lồng nhau trong chế độ ánh xạ bộ nhớ với mmap_mode="r".

1
Cảm ơn rất nhiều! Điều này là hữu ích.
msunbot

1
Nó có nghĩa là chúng ta nên sử dụng Joblibhết Pickle? Bất kỳ nhược điểm của Joblibchúng tôi nên xem xét? Tôi vừa mới nghe về Joblibnó gần đây và nó có vẻ thú vị đối với tôi.
Catbuilts

1
Tôi đã cập nhật câu trả lời của mình với những nhược điểm và những điều mới xảy ra trong thư viện chuẩn.
ogrisel,

2
Có phải joblib cũng thực thi mã tùy ý trong quá trình giải nén không? (Không an toàn)
Mr-Programs

Điều này thật khó để đọc hết "Lưu ý rằng ..." và nhận được bản tóm tắt một dòng: joblib nhanh hơn X lần để viết các mảng lớn trong 3.8, gần như X là gì? và đọc? và pickle nhanh hơn khoảng Y lần để viết nhiều đối tượng Python nhỏ, Y là gì? và đọc? Ngoài ra, tỷ lệ nén / kích thước tệp tương đối là gì?
smci

12

Cảm ơn Gunjan đã cho chúng tôi tập lệnh này! Tôi đã sửa đổi nó cho các kết quả 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 đã sử dụng tệp kén 1154320653 KB. Một tệp lớn hơn có thể tạo ra sự khác biệt có lợi cho joblib không?
guiferviz

Vui lòng luôn nêu rõ phiên bản Python của bạn khi hiển thị số hiệu suất. 2,6? 2,7? 3,6? 3,7? Vẫn tốt hơn, hãy báo cáo số tương đối joblib vs pickle vs cPickle. Ngoài ra, hãy sửa lỗi của Gunjan là 1,1 GB không phải 1,1 TB
smci

8

Tôi đã gặp phải câu hỏi tương tự, vì vậy tôi đã thử câu hỏi này (với Python 2.7) vì tôi cần tải một tệp dưa chua lớn

#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

Đầu ra cho điều này là

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

Theo joblib này hoạt động tốt hơn mô-đun cPickle và Pickle từ 3 mô-đun này. Cảm ơn


1
Tôi nghĩ cpickle nên nhanh hơn dưa chua?
Echo

Điểm chuẩn này có được thực hiện với python 3, sử dụng pickle (giao thức = 3) theo mặc định (nhanh hơn mặc định trong python2) không?
LearnOPhile 15/09/17

3
os.path.getsize trả về byte chứ không phải kilobyte, vì vậy chúng ta đang nói về một tệp có dung lượng xấp xỉ 1,1 GB (chứ không phải 1,1 TB như nó có vẻ từ đầu ra)
Vlad Iliescu

Điều này thật tuyệt, nhưng hãy sửa đầu ra để phản ánh nó là 1,1 GB không phải 1,1 TB. Vẫn tốt hơn là vẽ các con số so sánh cho các kích thước tệp trong lũy ​​thừa-10 từ 1KB ... 10GB, cho các phiên bản Python 3.6, 3.7, 3.8 và 2.7, cho joblib, pickle và cPickle.
smci
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.