如何防止在Julia模块中迭代使用全局数组?



如何防止在模块迭代中使用全局数组?

module Mod
global AAA=Array{Float64,1}(undef, 999999999)
for  i in 1:100
f(AAA, AAAupdate)   # function f take in AAA, update it and output the updated array as AAAupdate
g(AAAupdate,AAA)  # function g take in the updatedAAA, and update it again to make a new AAA, and output the new AAA as AAA.        
end
end

可以看到,对于每个i循环,

首先需要将大数组AAA输入函数f,然后更新为aaupdate。

然后函数g接受aaupdate数组,并进一步更新它,形成更新后的数组AAA。

然后在下一个循环中,将在函数f中再次读取新更新的AAA,此过程重复100次。

最后,在100次循环后,AAA将完全更新。

在这种情况下,再次因为Julia不鼓励全局的东西,有没有办法防止AAA一个全局数组?

我将从Discourse中交叉发布我的答案,它实际上实现了Jerry的答案的第一段:

julia> function main()
AAA = zeros(5)
for i ∈ 1:2
f!(AAA)
g!(AAA)
end
return AAA
end
main (generic function with 1 method)
julia> main()
5-element Vector{Float64}:
12.0
12.0
12.0
12.0
12.0

如果你的整个模块一次只能做一个计算,那么使用全局的东西是可以的。

传统的解决方案是将该数组放入调用for循环的同一个函数中:

function do_MC(L)
AAA = Vector......
AAA_up = similar(AAA)
for i = 1:L
f!(AAA, AAA_up)
g!(AAA_up, AAA)
end
return AAA
end

但是全局是很好的速度方面,只要你:

const AAA=Array{Float64,1}(undef, 999999999)

但我有两个问题要问你:

  1. 真的需要999999999个元素吗?这不像我们在做NOI竞争,人们只是快速而肮脏地预先分配最大长度向量。
  2. 你是否准备好让你的模块线程不安全,因为现在用户不能并行使用for循环。

最新更新