【发布时间】:2012-05-03 12:13:01
【问题描述】:
%python -m timeit -s "import copy" "x = (1, 2, 3)" "copy.deepcopy(x)"
100000 loops, best of 3: 10.1 usec per loop
%python -m timeit -s "import copy" "x = (1, 2, 3)" "copy.copy(x)"
1000000 loops, best of 3: 0.609 usec per loop
为什么 deepcopy 比 copy 慢 15 倍?
每个函数都必须遍历元组的元素。在该迭代期间,copy 为每个元素创建另一个引用; deepcopy 深度复制每个元素。
但是每个元素都是一个int,并且深度复制一个int 只会创建另一个对其的引用。换句话说,这两个函数似乎执行完全相同的步骤,执行相同的次数。
这是验证过程中没有创建新实例:
ActivePython 3.2.1.2 (ActiveState Software Inc.) based on
Python 3.2.1 (default, Jul 18 2011, 14:31:09) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x = (1,2,3)
>>> import copy
>>> y = copy.copy(x)
>>> z = copy.deepcopy(x)
>>> x is y
True
>>> x is z
True
>>> x[1] is z[1]
True
【问题讨论】:
-
不是一个真正的答案,而是一个怀疑:
deepcopy需要跟踪它已经复制了哪些元素以允许循环引用,这可能会增加一些开销,尤其是在这种简单的情况下。跨度> -
如果您可以滚动自己的“deepcopy”副本,那可能是值得的。我正在分析一些进化算法代码,它在 deepcopy 上花费了大量时间。我能够确定算法所需的约束并编写我自己的有限版本的 deepcopy,从而显着提高速度。您的里程可能会有所不同。
标签: python performance python-3.x copy deep-copy