在Python 2.6中,defaultdict是否已成为不可编组的?以下在2.5下工作,在OS X 1.5.6上的"ValueError:unmarshallable object",python.org的python-2.6.1-macosx2008-12-06.dmg下失败了2.6:
from collections import defaultdict import marshal dd = defaultdict(list) marshal.dump(dd, file('/tmp/junk.bin','wb') )
Miles.. 11
故意将Marshal更改为不支持内置类型的子类.Marshal从来不应该处理违约,但碰巧因为它们是dict的子类. 元帅不是一般的"持久性"模块; 仅支持None,整数,长整数,浮点数,字符串,Unicode对象,元组,列表,集,字典和代码对象.
Python 2.5:
>>> marshal.dumps(defaultdict(list)) '{0' >>> marshal.dumps(dict()) '{0'
如果由于某种原因你真的想编组一个defaultdict,你可以先把它转换为dict,但是你应该使用不同的序列化机制,比如酸洗.
故意将Marshal更改为不支持内置类型的子类.Marshal从来不应该处理违约,但碰巧因为它们是dict的子类. 元帅不是一般的"持久性"模块; 仅支持None,整数,长整数,浮点数,字符串,Unicode对象,元组,列表,集,字典和代码对象.
Python 2.5:
>>> marshal.dumps(defaultdict(list)) '{0' >>> marshal.dumps(dict()) '{0'
如果由于某种原因你真的想编组一个defaultdict,你可以先把它转换为dict,但是你应该使用不同的序列化机制,比如酸洗.
wrt性能问题..编码一个~600000个dicts的列表,每个包含4个键/值,其中一个值有一个列表(大约1-3个长度)的2个键/ val dicts:
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