当我们需要从包含原始数据类型的字典中复制完整数据时(为简单起见,让我们忽略数据类型的存在,比如datetime等),我们最明显的选择是使用deepcopy
,但深度复制比其他一些实现的hackish方法慢相同的,例如使用序列化 - 非序列化,例如json-dump-json-load或msgpack-pack-msgpack-unpack。效率的差异可以在这里看到:
>>> import timeit>>> setup = ''' ... import msgpack ... import json ... from copy import deepcopy ... data = {'name':'John Doe','ranks':{'sports':13,'edu':34,'arts':45},'grade':5} ... '''>>> print(timeit.timeit('deepcopy(data)', setup=setup))12.0860249996>>> print(timeit.timeit('json.loads(json.dumps(data))', setup=setup))9.07182312012>>> print(timeit.timeit('msgpack.unpackb(msgpack.packb(data))', setup=setup))1.42743492126
json和msgpack(或cPickle)方法比普通的深度复制更快,这很明显,因为深度复制在复制对象的所有属性方面也会做得更多。
问题:是否有更多的pythonic /内置方法来实现字典或列表的数据副本,而没有深度复制所具有的所有开销?
评论专区