我有一个Python程序,可以很好地处理字典。我必须复制词典数千次。我需要密钥和相关内容的副本。副本将被编辑,不得与原件相关联(例如,副本中的更改不得影响原件。)
键是字符串,值是整数(0/1)。
我目前使用的方法很简单:
newDict = oldDict.copy()
对我的代码进行概要分析表明复制操作占用了大部分时间。
dict.copy()
方法有更快的替代方案吗?什么会最快?
答案 0 :(得分:62)
查看Python dict
操作的C source,您可以看到他们做了一个非常天真(但有效)的副本。它基本上归结为对PyDict_Merge
:
PyDict_Merge(PyObject *a, PyObject *b, int override)
这可以快速检查诸如它们是否是同一个对象以及它们是否有对象。之后,它会对目标字典进行大量的一次性调整大小/分配,然后逐个复制元素。我没有看到你比内置的copy()
快得多。
答案 1 :(得分:54)
正如你所说,显然dict.copy更快。
[utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = d.copy()"
1000000 loops, best of 3: 0.238 usec per loop
[utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = dict(d)"
1000000 loops, best of 3: 0.621 usec per loop
[utdmr@utdmr-arch ~]$ python -m timeit -s "from copy import copy; d={1:1, 2:2, 3:3}" "new = copy(d)"
1000000 loops, best of 3: 1.58 usec per loop
答案 2 :(得分:12)
您能提供代码示例,以便了解您如何使用copy()以及在什么情况下使用?
您可以使用
new = dict(old)
但我不认为它会更快。
答案 3 :(得分:3)
根据你留给推测的内容,你可能想要包装原始字典并进行类写时复制。
然后“复制”是一个字典,它在“父”字典中查找内容,如果它还没有包含密钥---但它本身就是修改。
这假设您不会修改原始内容,并且额外查找最终不会花费更多。
答案 4 :(得分:3)
我意识到这是一个旧线程,但这对搜索引擎来说是一个很高的结果,因为" dict copy python",以及" dict copy performance"的顶级结果,我相信这是相关的。
从Python 3.7开始,newDict = oldDict.copy()
比以前快了5.5倍。值得注意的是,目前,newDict = dict(oldDict)
似乎没有这种性能提升。
还有更多信息here。