替代 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,它根本不使用 deepcopy
或 add_edge!
)。
我在 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,它根本不使用 deepcopy
或 add_edge!
)。