2016-06-19 18 views
6

Tôi đang cố gắng tuần tự hóa hàng nghìn đối tượng và một số đối tượng này là các đối tượng lambda.thì là so với chênh lệch tốc độ cPickle

cPickle không hoạt động đối với lambdas, tôi đã thử sử dụng dill. Tuy nhiên, sự sụt giảm tốc độ tính toán là hơn 10 lần khi tháo bỏ (hoặc không hoàn thành (?)). Nhìn qua nguồn, có vẻ như dill sử dụng pickle nội bộ có thể là lý do cho việc giảm tốc độ.

Có tùy chọn nào khác cho tôi kết hợp tốt nhất của cả hai mô-đun không?

CHỈNH SỬA: Giảm tốc độ đáng kể nhất là trong quá trình bỏ tạm dừng.

+0

séc [câu trả lời này] (http://stackoverflow.com/a/16626757/5741205) – MaxU

+0

Vấn đề, như tôi đã nói trong câu hỏi của tôi, đó là 'dill' là quá chậm so với cPickle. – Tohiko

+0

"Các đối tượng được tuần tự hóa _PiCloud có thể được loại bỏ bằng cách sử dụng tải bình thường/tải cPickle và tải các hàm._", vì vậy tôi nghĩ nó có thể giúp bạn nếu tỷ lệ 'serialization/desiralization' là' << 1' – MaxU

Trả lời

14

Tôi là tác giả dill. Có, dill thường chậm hơn, nhưng đó là hình phạt bạn phải trả cho việc tuần tự hóa mạnh mẽ hơn. Nếu bạn đang tuần tự hóa rất nhiều lớp và chức năng, thì bạn có thể muốn thử một trong các biến thể dill trong dill.settings Nếu bạn sử dụng byref=True thì dill sẽ chọn một vài đối tượng theo tham chiếu (nhanh hơn giá trị mặc định). Các cài đặt khác có thể loại bỏ khả năng chọn tốc độ trong các đối tượng được chọn.

In [1]: import dill 

In [2]: f = lambda x:x 

In [3]: %timeit dill.loads(dill.dumps(f)) 
1000 loops, best of 3: 286 us per loop 

In [4]: dill.settings['byref'] = True 

In [5]: %timeit dill.loads(dill.dumps(f)) 
1000 loops, best of 3: 237 us per loop 

In [6]: dill.settings 
Out[6]: {'byref': True, 'fmode': 0, 'protocol': 2, 'recurse': False} 

In [7]: dill.settings['recurse'] = True 

In [8]: %timeit dill.loads(dill.dumps(f)) 
1000 loops, best of 3: 408 us per loop 

In [9]: class Foo(object): 
    ...:  x = 1 
    ...:  def bar(self, y): 
    ...:   return y + self.x 
    ...:  

In [10]: g = Foo() 

In [11]: %timeit dill.loads(dill.dumps(g)) 
10000 loops, best of 3: 87.6 us per loop 

In [12]: dill.settings['recurse'] = False 

In [13]: %timeit dill.loads(dill.dumps(g)) 
10000 loops, best of 3: 87.4 us per loop 

In [14]: dill.settings['byref'] = False 

In [15]: %timeit dill.loads(dill.dumps(g)) 
1000 loops, best of 3: 499 us per loop 

In [16]: 
+1

Hi @Mike McKerns, khi tôi bắt đầu sử dụng 'dill' cho các lớp' Python' tùy chỉnh mà tôi đã tạo ra có nhiều kiểu dữ liệu phức tạp bên trong và nó hoạt động hoàn hảo (khi 'pickle' không). Tôi đã sử dụng 'dill' kể từ đó nhưng tôi tự hỏi loại dữ liệu nào tôi có thể sử dụng' pickle' cho điều đó sẽ không bị phá vỡ? Điều này có thể nằm ngoài phạm vi của một bình luận nhưng tôi cảm thấy như bạn sẽ là chuyên gia kể từ khi bạn thực hiện 'dill' cho một lý do. –

+2

Xem https://github.com/uqfoundation/dill/blob/master/dill/_objects.py. Đó là nỗ lực tốt nhất của tôi để theo dõi những gì có thể được ngâm và những gì không thể (bởi 'dill' và/hoặc' pickle'). Có một thử nghiệm liên quan cho tệp này. Bây giờ, đặt chúng vào trong các lớp học ... đó là một chút chưa được kiểm chứng. –

Các vấn đề liên quan