gpt4 book ai didi

arrays - 逐个元素构建 Julia 数组的有效方法

转载 作者:行者123 更新时间:2023-12-02 18:48:40 25 4
gpt4 key购买 nike

当我不确定最终数组大小时,逐个元素构建 Julia 数组的最佳方法是什么?在我的问题中,我在单个 for 循环中构建数组。

到目前为止,我已经发现我可以插入数组或索引到预先分配的数组中:

using BenchmarkTools

function push_to_array!(array, N)
for i in 1:N
# some computation
push!(array, rand(Int64))
end
end

function fill_array!(array, N)
for i in 1:N
# some computation
array[i]=rand(Int64)
end
end

N = 100_000_000 # unknown in the real problem

empty = Vector{Int64}()
preallocated = Vector{Int64}(undef, 2*N) # 2*N represents some upper bound on N

@btime push_to_array!(empty, N)
# 28.272 s (6 allocations: 0 bytes)
@btime fill_array!(preallocated, N)
# 2.449 s (0 allocations: 0 bytes)

因此,填充预分配数组比推送要快得多,但是,这有点麻烦,因为我需要使用 Correct_size = preallocated[1:N] 修剪输出。

有更快/更好的方法吗?

最佳答案

在 Julia 中,您可以拥有 View - 无需修剪。只需执行以下操作:

correct_size = @view preallocated[1:1_000_000]

correct_size = view(preallocated, 1:1_000_000)

现在这个操作非常便宜(顺便说一句,还请注意,您没有正确进行基准测试,因为 @time 测量编译时间和执行时间):

julia> using BenchmarkTools

julia> @btime correct_size = @view $preallocated[1:1_000_000];
1.800 ns (0 allocations: 0 bytes)

总之,制作 View 基本上是免费的。

最后,请注意,您可以调整大小! 数组(时间成本与 @view 的情况相同):

resize!(preallocated, 1_000_000)

关于arrays - 逐个元素构建 Julia 数组的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67076011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com