替代 Julia 中的 deepcopy()

Alternative to deepcopy() in Julia

我在 Julia 中有以下代码:

using LightGraphs
using LinearAlgebra
prop=[1 rand() rand() rand() rand(); rand() 1 rand() rand() rand(); rand() rand()  1 rand() rand(); rand() rand() rand() 1 rand(); rand() rand() rand() rand() 1]
prop=Symmetric(prop)
thresh=sort(unique(prop)
g=[SimpleGraph(0) for a in 1:length(thresh)]
for j=1:length(thresh)
    g[j]=Graph(Int.(prop.>=thresh[j])-I)
end

我需要创建 g 的副本,比如 g2,我需要在其上使用函数 add_edge! 但不修改原始对象 g。我知道 g2=deepcopy(g) 会完美地完成这个技巧,但是如果 g 非常大(在这个简单的例子中不是这种情况),函数 deepcopy() 需要花费大量时间来创建独立副本。我用@time测的。在 Julia 中有没有另一种方法可以做我想做的事而无需花费大量时间来制作 g 的副本?我必须多次 运行 代码,并希望避免仅仅为了复制 g.

而浪费时间

我认为您不需要 deepcopy 的替代方案,它已经在满足您的需求。只是堆内存分配(由 deepcopy 完成)需要时间。 您可以做的是制作 g 的单个副本,然后在每次需要 deepcopy 函数时更新它,它可能看起来像这样

g_copy = deepcopy(g)
add_edge!(g_copy[i], edge)
# ... do stuff
g_copy .= g

这样你只会改变g_copy的内容但不会释放内存,所以应该会更快。我应该提到这是未经测试的(因为我不能自然地扩展你的 MWE,它根本不使用 deepcopyadd_edge!)。