производительность copy.copy и copy.deepcopy для кортежей

%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в 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
5
задан max 22 April 2012 в 19:20
поделиться