首页 > 解决方案 > 朱莉娅推!- 尝试收集数据时不是正确的命令

问题描述

每次我需要在数组“外部”函数中收集数据时,我都在与 Julia 作斗争。

如果我使用push!(element, array)我可以在数组中收集数据,但如果代码在循环内,那么数组每次都会“增长”。

你有什么建议吗?

我知道这是很基本的:)但是谢谢!

标签: julia

解决方案


我认为您不想使用push!的原因是因为您之前使用过 Matlab,这种操作非常缓慢(准确地说,它是一种O(n^2)操作,因此n运行时间翻了两番)。对于 Julia 来说,情况并非如此push!,因为push!使用了此处O(n)描述的算法(因此加倍只会n使运行时间加倍)。

您可以通过实验轻松地检查这一点。在 Matlab 中,我们有

>> n = 100000; tic; a = []; for i = 1:n; a = [a;0]; end; toc
Elapsed time is 2.206152 seconds.

>> n = 200000; tic; a = []; for i = 1:n; a = [a;0]; end; toc
Elapsed time is 8.301130 seconds.

所以实际上运行时间翻了两番,大小是原来n的两倍。相反,在 Julia 中,我们有

julia> using BenchmarkTools

       function myzeros(n)
           a = Vector{Int}()
           for i = 1:n
               push!(a,0)
           end
           return a
       end

       @btime myzeros(100_000);
       @btime myzeros(200_000);
  486.054 μs (17 allocations: 2.00 MiB)
  953.982 μs (18 allocations: 3.00 MiB)

所以实际上运行时间只有n两倍的大小。

长话短说:如果您知道最终数组的大小,那么预分配数组总是最好的(即使在 Julia 中也是如此)。但是,如果您不知道最终的数组大小,那么您可以使用push!而不会损失太多性能。


推荐阅读