我在 Julia 中运行一个空的双循环
Ngal = 16000000
function get_vinz()
for i in 1:5
print(i, " ")
for j in i:Ngal
end
end
end
Run Code Online (Sandbox Code Playgroud)
@time Vinz() 的结果给了我
1 2 3 4 5 5.332660 seconds (248.94 M allocations: 4.946 GiB, 7.12% gc time)
Run Code Online (Sandbox Code Playgroud)
分配的5GB内存是做什么用的?
罪魁祸首是全局变量的使用。您的函数调用全局变量,并且每次调用都会分配一个 Int64(64 位)。64*16000000*5/1024/1024 = 4882.8125 MiB,这似乎是您的函数不知道内部循环的大小的罪魁祸首,并且在全局范围上进行查找以检查Ngal. 它在每个循环中都会这样做。与此实现进行比较:
function get_vinz(Ngal)
for i in 1:5
print(i, " ")
for j in i:Ngal
end
end
end
julia> @time get_vinz(Ngal)
1 2 3 4 5 0.043481 seconds (53.67 k allocations: 2.776 MiB)
Run Code Online (Sandbox Code Playgroud)
另外,在 julia 中第一次调用函数时,会被编译为机器代码,因此后续运行速度很快。再次测量时间:
julia> @time get_vinz(Ngal)
1 2 3 4 5 0.000639 seconds (50 allocations: 1.578 KiB)
Run Code Online (Sandbox Code Playgroud)
一般来说,使用全局变量是一种不好的做法。推荐的方法是将这些值传递给函数