Python:defaultdict在2.6中成为unmarshallable对象?

Par*_*and 9 python

在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') )
Run Code Online (Sandbox Code Playgroud)

Mil*_*les 11

故意将Marshal更改为不支持内置类型的子类.Marshal从来不应该处理违约,但碰巧因为它们是dict的子类. 元帅不是一般的"持久性"模块; 仅支持None,整数,长整数,浮点数,字符串,Unicode对象,元组,列表,集,字典和代码对象.

Python 2.5:

>>> marshal.dumps(defaultdict(list))
'{0'
>>> marshal.dumps(dict())
'{0'
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你真的想编组一个defaultdict,你可以先把它转换为dict,但是你应该使用不同的序列化机制,比如酸洗.


dsv*_*son 7

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
Run Code Online (Sandbox Code Playgroud)