Я работал над критически важным для производительности приложением, которое часто требует создания копий двумерного списка целых чисел и изменения копии (я реализую минимаксный алгоритм).
Я заметил огромную разницу в производительности между копией и глубокой копией в списках с одинаковым количеством элементов, и мне хотелось бы понять, правильно ли я думаю.
Чтобы воспроизвести мою проблему, запустите следующий код:
import numpy as np
np.random.seed(0)
lst1 = np.random.randint(100, size=1000 * 1000).tolist()
lst2 = np.random.randint(100, size=(1000, 1000)).tolist()
Теперь, рассчитав время для утверждений ниже, вы должны увидеть время, подобное моему.
%timeit copy.copy(lst1)
%timeit lst1.copy()
%timeit copy.deepcopy(lst2)
5 ms ± 49.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5.47 ms ± 551 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.61 s ± 112 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
И lst1
, и lst2
имеют миллион элементов, но надежное копирование первого происходит в 200 раз быстрее, чем вложенный список с таким же количеством элементов. Я думал, что это связано с тем, что создание глубоких копий вложенных списков может потребовать некоторой медленной рекурсивной реализации, поэтому я попробовал
%timeit copy.deepcopy(lst1)
1.43 s ± 90.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
И тайминги по-прежнему показывают резкое замедление. Я проверил документы, но подробных объяснений предложено не было. . Однако, судя по таймингу, я подозреваю, что deepcopy
также копирует каждый int, создавая новые целые числа. Но это кажется расточительным занятием.
Я прав в своих мыслях? Что делает здесь deepcopy, чего list.copy
и мелкое копирование не делают?
Я видел, как deepcopy () работает очень медленно, но похоже, что этот вопрос требует альтернативы а не объяснение (мне было непонятно).
deepcopy
: он копирует все. Он не знает, что вы хотите только скопировать списки. - person chepner   schedule 31.01.2019[sub.copy() for sub in nested_list]
. Это будет намного быстрее - person juanpa.arrivillaga   schedule 31.01.2019