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

Joe*_*ern 90 python performance dictionary copy

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

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

我目前使用一种简单的方法:

newDict = oldDict.copy()
Run Code Online (Sandbox Code Playgroud)

分析我的代码显示复制操作占用大部分时间.

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

Dan*_*olo 62

查看Python 操作的C源代码dict,您可以看到它们执行了一个非常天真(但有效)的副本.它基本上归结为PyDict_Merge:

PyDict_Merge(PyObject *a, PyObject *b, int override)
Run Code Online (Sandbox Code Playgroud)

这样就可以快速检查它们是否是同一个对象,以及它们中是否有对象.之后,它会对目标字典进行大量的一次性调整大小/分配,然后逐个复制元素.我没有看到你比内置更快copy().


utd*_*mir 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
Run Code Online (Sandbox Code Playgroud)

  • 在不计算每次导入成本的情况下进行最后一次比较的方法是使用`timeit`的`-s`参数:来自复制导入副本的`python -m timeit -s""new = copy({1 :1,2:2,3:3})"`.当你在它的同时,也可以提取dict创建(对于所有的例子). (4认同)
  • Timeit做到了; 因为它说它循环1000000次并平均. (2认同)

Mik*_*han 12

你能提供一个代码示例,这样我就可以看到你如何使用copy()以及在什么情况下?

你可以用

new = dict(old)
Run Code Online (Sandbox Code Playgroud)

但我不认为它会更快.


小智 7

我意识到这是一个旧线程,但这是搜索引擎中“dict copy python”的最高结果,以及“dict copy performance”的最高结果,我相信这是相关的。

从 Python 3.7 开始,newDict = oldDict.copy()速度比以前快 5.5 倍。值得注意的是,目前newDict = dict(oldDict)似乎没有这种性能提升。

有一点点的更多信息这里