我一直在广泛地使用NetworkX进行研究,但遇到的某些问题令我感到困惑。我一直在使用copy.deepcopy()复制图,但是刚意识到生成深拷贝的Graph类has its own .copy() method

我决定使用%timeit来查看自己是否有残障,并最终获得了带有25个节点和66条边的图G的以下结果:

%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()是错误的选择。

最佳答案

您可以自己查看源代码:[GitHub]: networkx/networkx - (master) networkx/networkx/classes/graph.py
根据[GitHub.NetworkX]: networkx.Graph.copy的说法(第一个URL中也存在相同的信息)(强调是我的):

默认情况下,copy方法返回图形和属性的独立的浅拷贝。也就是说,如果属性是容器,那么该容器将由原始容器和副本共享。 将Python的copy.deepcopy用于新容器
...
Deepcopy –“deepcopy”将复制图结构以及所有数据属性以及它们可能包含的任何对象。整个图形对象是新的,因此副本中的更改不会影响原始对象。 (请参阅Python的copy.deepcopy)
...
独立浅 –此副本创建新的独立属性字典,然后对属性进行浅拷贝。即,在新图和原始图之间共享作为容器的任何属性。这正是dict.copy()提供的。

Graph.copy(可能)所做的是为了保留内存的其他计算。
因此,如果您需要2个完全独立的图,则可以使用copy.deepcopy而不会出现任何问题。

关于python - 为什么Graph.copy()比NetworkX中的copy.deepcopy(Graph)慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60310123/

10-12 22:48