copy.copy vs copy.deepcopy在元组上的性能

max*_*max 5 python performance copy deep-copy python-3.x

%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
Run Code Online (Sandbox Code Playgroud)

为什么deepcopy慢15倍copy

每个函数都必须遍历元组的元素.在该迭代期间,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
Run Code Online (Sandbox Code Playgroud)

Rob*_*let 7

元组是不可变的,但它们可以包含可变元素:

>>> a = (1, 2, [])
>>> a[2].append(1000)
>>> a
(1, 2, [1000])
Run Code Online (Sandbox Code Playgroud)

请注意,元组不会更改:它是列表中的元组; 元组仍然包含完全相同的列表.

deepcopy应该递归复制那些可变元素.copy只需复制对它们的引用.

>>> from copy import copy, deepcopy

>>> a = (1, 2, [])
>>> c = copy(a)
>>> d = deepcopy(a)

>>> a[2].append(1000)

>>> c
(1, 2, [1000])
>>> d
(1, 2, [])
Run Code Online (Sandbox Code Playgroud)

  • 你是对的,不需要为`copy`迭代.Python甚至不需要`memcpy`:它只能返回对原始元组的另一个引用!当然,这不适用于`deepcopy`. (3认同)