你如何使用msgpack替换Python中的copy.deepcopy?

时间:2018-01-11 13:44:36

标签: python

根据这篇文章What is a fast pythonic way to deepcopy just data from a python dict or list ? msgpack比copy.deepcopy快10倍,但我无法弄清楚如何使用它。

我试过

item2 = msgpack.unpack(msgpack.packb(item1))

取代:

item2 = copy.deepcopy(item1)

但是我得到了

File "msgpack/_unpacker.pyx", line 228, in msgpack._unpacker.unpack
AttributeError: 'bytes' object has no attribute 'read'

位于http://msgpack-python.readthedocs.io/en/latest/api.html的文档难以理解,但这并不奇怪,因为几乎所有的计算机文档对我来说都是不可理解的。

2 个答案:

答案 0 :(得分:1)

如果查看文档,msgpack.unpack需要一个流,而不是一个字节块:

>>> help(msgpack.unpack)
Help on built-in function unpack in module msgpack._unpacker:

    unpack(...)
        unpack(stream, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors='strict', object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=2147483647, Py_ssize_t max_bin_len=2147483647, Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647)

就像您使用packb打包对象一样,您应该使用unpackb来解压缩它:

>>> item2 = msgpack.unpackb(msgpack.packb(item1))

答案 1 :(得分:0)

你正在使用packb()返回压缩字节,所以要解包,应该使用unpackb()

unpacmsgpack.unpackb(msgpack.packb(item1))