Почему Graph.copy () медленнее, чем copy.deepcopy (Graph) в NetworkX? - PullRequest
3 голосов
/ 20 февраля 2020

Я широко использовал NetworkX для своих исследований, но я столкнулся с тем, что немного озадачивает (и касается) меня. Я использовал copy.deepcopy() для копирования графиков, но только что понял, что класс Graph имеет свой собственный метод .copy () , который генерирует глубокую копию.

Я решил использовать %timeit, чтобы посмотреть, был ли я гандикапом, и в итоге получил следующие результаты для графика G с 25 узлами и 66 ребрами:

%timeit for x in range(100): copy.deepcopy(G)
80.5 ms ± 1.26 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit for x in range(100): G.copy()
93.4 ms ± 1.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Что NetworkX делает по-другому, что занимает больше времени? Это беспокоит меня, что я делаю это неправильно, но я не сталкивался с серьезными проблемами, которые указывали бы на то, что использование copy.deepcopy() - неправильный выбор.

1 Ответ

2 голосов
/ 20 февраля 2020

Вы можете посмотреть исходный код самостоятельно: [GitHub]: networkx / networkx - (master) networkx / networkx / classes / graph.py .

Согласно [GitHub.NetworkX]: networkx.Graph.copy (та же информация присутствует и в 1 st URL ) ( выделение принадлежит мне) :

Метод копирования по умолчанию возвращает независимую мелкую копию графика и атрибутов. То есть, если атрибут является контейнером, этот контейнер является общим для оригинала и копии. Используйте Python copy.deepcopy для новых контейнеров .

...

Deepcopy - «Deepcopy» копирует структура графа, а также все атрибуты данных и любые объекты, которые они могут содержать. Весь объект графа является новым, поэтому изменения в копии не влияют на исходный объект. (см. Python's copy.deepcopy)

...

Независимая мелкая - эта копия создает новые независимые атрибуты, а затем делает мелкую копию из атрибутов. То есть любые атрибуты, которые являются контейнерами, совместно используются новым графиком и оригиналом. Это именно то, что обеспечивает dict.copy().

То, что делает Graph.copy (вероятно), это дополнительные вычисления для сохранения памяти.

Итак, если вам нужны 2 полностью независимых графика, вы можете без проблем использовать copy.deepcopy .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...