作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我不确定最终数组大小时,逐个元素构建 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/
我尝试在 d3.js 中进行链式转换。为此,我在数组中定义了一组转换,并(尝试)创建一个函数以使用 .each("end", function()) 递归调用它们,以在前一个为完成,但我还没有结果。
我是一名优秀的程序员,十分优秀!