快速的方法来在Python中复制字典
我有一个Python程序,与字典很多。 我必须复制数千次的字典。 我需要密钥和相关内容的副本。 副本将被编辑,不得链接到原件(例如,副本中的更改不得影响原件。)
键是string,值是整数(0/1)。
我目前使用一个简单的方法:
newDict = oldDict.copy()
分析我的代码显示,复制操作大部分时间都需要。
dict.copy()
方法有更快的select吗? 什么是最快的?
查看Python dict
操作的C源代码 ,可以看到它们做了一个非常天真的(但是高效的)拷贝。 它基本归结为对PyDict_Merge
的调用:
PyDict_Merge(PyObject *a, PyObject *b, int override)
这样做的快速检查,如果他们是同一个对象,如果他们有对象。 之后,它会对目标字典进行一次性大小调整/分配,然后逐个复制元素。 我没有看到你比内置的copy()
更快。
如你所说,显然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
你能提供一个代码示例,所以我可以看到你是如何使用copy()和在什么情况下?
你可以使用
new = dict(old)
但我不认为这会更快。
根据你猜测的事情,你可能想要包装原来的字典,并做一个写时复制。
然后,“复制”是一个字典,它查找“父”字典中的东西,如果它还没有包含密钥的话 – 但是它本身就是修改的。
这假定你不会修改原来的,额外的查找不会花费更多的成本。
测量依赖于字典的大小。 对于10000条目,副本(d)和d.copy()几乎相同。
a = {b: b for b in range(10000)} In [5]: %timeit copy(a) 10000 loops, best of 3: 186 µs per loop In [6]: %timeit deepcopy(a) 100 loops, best of 3: 14.1 ms per loop In [7]: %timeit a.copy() 1000 loops, best of 3: 180 µs per loop