5
%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

なぜdeepcopy15倍遅いのですcopyか?

各関数は、タプルの要素を反復処理する必要があります。その反復中に、copy各要素への別の参照を作成します。deepcopy各要素をディープコピーします。

ただし、各要素はでありint、単純にディープコピーすると、その要素intへの別の参照が作成されます。つまり、2つの関数は、まったく同じステップ、同じ回数を実行しているように見えます。

プロセスで新しいインスタンスが作成されていないことの確認は次のとおりです。

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
4

1 に答える 1

7

タプルは不変ですが、可変要素を含めることができます。

>>> a = (1, 2, [])
>>> a[2].append(1000)
>>> a
(1, 2, [1000])

タプルは変更されないことに注意してください。変更されるのはリストです。タプルには、まったく同じリストが含まれています。

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, [])
于 2012-04-22T19:12:21.257 に答える