2009-03-20 35 views
9

Defaultdict có trở thành không thể so sánh được với Python 2.6 không? Các công trình sau đây dưới 2.5, không dưới 2,6 với "ValueError: đối tượng unmarshallable" trên OS X 1.5.6, python-2.6.1-macosx2008-12-06.dmg từ python.org:Python: defaultdict trở thành đối tượng unmarshallable trong 2.6?

from collections import defaultdict 
import marshal 
dd = defaultdict(list) 
marshal.dump(dd, file('/tmp/junk.bin','wb')) 

Trả lời

11

Marshal was deliberately changed to not support subclasses of built-in types. Nguyên soái không bao giờ phải xử lý defaultdicts, nhưng xảy ra vì họ là một phân lớp của dict. Marshal is not a general "persistence" module; only None, integers, long integers, floating point numbers, strings, Unicode objects, tuples, lists, sets, dictionaries, and code objects are supported.

Python 2.5:

>>> marshal.dumps(defaultdict(list)) 
'{0' 
>>> marshal.dumps(dict()) 
'{0' 

Nếu vì một lý do nào bạn thực sự muốn sắp xếp một defaultdict bạn có thể chuyển nó sang một dict đầu tiên, nhưng tỷ lệ cược là bạn nên sử dụng một cơ chế serialization khác nhau, như pickling.

+0

Cảm ơn Miles. Vấn đề là có một sự khác biệt rất lớn về hiệu suất giữa tẩy và marshaling - ở kích thước dữ liệu tôi đang làm việc với nó một vài giờ cho mỗi lần chạy. Tôi đoán tôi sẽ gắn với 2.5 hoặc chuyển đổi thành một dict trước khi marshaling. – Parand

+0

Bạn đang sử dụng cPickle, với HIGHEST_PROTOCOL? – Miles

7

vấn đề hiệu suất wrt .. mã hóa một danh sách các ~ 600000 dicts, mỗi với 4 khóa/giá trị, một trong những giá trị có một danh sách (khoảng 1-3 chiều dài) của 2 chìa khóa/dicts val:

In [27]: timeit(cjson.encode, data) 
4.93589496613 

In [28]: timeit(cPickle.dumps, data, -1) 
141.412974119 

In [30]: timeit(marshal.dumps, data, marshal.version) 
1.13546991348 
+1

gc.disable(); timeit (cPickle.dumps, ...); gc.enable() giảm thời gian xuống còn khoảng 14 giây, có thể là một sự cải thiện đủ tốt –

+0

Các điểm chuẩn tương tự ở đây và nguyên soái nhanh hơn khoảng 15 lần so với cPickle cho từ điển và danh sách trên BeagleBoard của tôi. Không bao giờ nghĩ rằng đó là trường hợp. Cảm ơn @dsvensson cho sự giác ngộ tự do. –

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