Глядя на код (вы тоже можете), он просматривает каждый объект в дереве ссылочных объектов (например, ключи и значения dict, переменные-члены объекта, ...) и выполняет для них две вещи:
- посмотреть, если оно уже было скопировано, посмотрев его в id-indexed
memo
dict - копию объекта, если не
Второй - O (1) для простых объектов.Для составных объектов одна и та же процедура обрабатывает их, поэтому для всех n объектов в дереве это O (n) .Первая часть, ищущая объект в диктовке, в среднем O (1) , но O (n) амортизированный наихудший случай .
Так что в лучшем случае в среднем deepcopy
является линейным.Ключи, используемые в memo
, представляют собой значения id()
, т. Е. Области памяти, поэтому они не распределяются случайным образом по пространству клавиш («средняя» часть выше) и могут вести себя хуже, вплоть до O (n^ 2) худший случай.Я действительно наблюдал некоторое снижение производительности при реальном использовании, но по большей части он вел себя как линейный.
Это часть сложности, но константа велика и deepcopy
совсем не дешево и вполне может быть причиной ваших проблем.Единственный верный способ узнать это использовать профилировщик - сделать это.Кстати, я сейчас переписываю ужасно медленный код, который тратит 98% времени выполнения на deepcopy
.