在Python中复制字典的快速方法

时间:2011-05-02 19:25:23

标签: python performance dictionary copy

我有一个Python程序,可以很好地处理字典。我必须复制词典数千次。我需要密钥和相关内容的副本。副本将被编辑,不得与原件相关联(例如,副本中的更改不得影响原件。)

键是字符串,值是整数(0/1)。

我目前使用的方法很简单:

newDict = oldDict.copy()

对我的代码进行概要分析表明复制操作占用了大部分时间。

dict.copy()方法有更快的替代方案吗?什么会最快?

5 个答案:

答案 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