Julia 朱莉娅推在尝试收集数据时不是正确的命令

Julia 朱莉娅推在尝试收集数据时不是正确的命令,julia,Julia,每当我需要在数组“外部”函数中收集数据时,我都在与Julia斗争 如果我使用推!(元素,数组)我可以在数组中收集数据,但是如果代码在循环中,那么数组每次都会“增长” 你推荐什么 我知道这是很基本的:)但是谢谢你 我假设您不想使用push的原因是因为您以前使用过Matlab,这类操作非常慢(准确地说,这是一个O(n^2)操作,因此运行时间翻倍n是原来的四倍)。这不是朱莉娅的推送,因为推使用所描述的算法,该算法仅为O(n)(因此,加倍n只会加倍运行时间) 你可以很容易地通过实验来检验这一点。在Mat

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

如果我使用
推!(元素,数组)
我可以在数组中收集数据,但是如果代码在循环中,那么数组每次都会“增长”

你推荐什么


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

我假设您不想使用
push的原因
是因为您以前使用过Matlab,这类操作非常慢(准确地说,这是一个
O(n^2)
操作,因此运行时间翻倍
n
是原来的四倍)。这不是朱莉娅的推送,因为
使用所描述的算法,该算法仅为
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> 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而不会损失太多性能

嗨,欢迎!我不清楚你到底想做什么<代码>推在末尾追加一个元素,这就是为什么您看到它会增长。