julia - 朱莉娅推!- 尝试收集数据时不是正确的命令
问题描述
每次我需要在数组“外部”函数中收集数据时,我都在与 Julia 作斗争。
如果我使用push!(element, array)
我可以在数组中收集数据,但如果代码在循环内,那么数组每次都会“增长”。
你有什么建议吗?
我知道这是很基本的:)但是谢谢!
解决方案
我认为您不想使用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!
而不会损失太多性能。
推荐阅读
- python - 如何使用re表达式python
- python - 从不同目录导入文件的方法之间的区别
- javascript - 为什么在初始加载之前反应计算渲染两次?
- mysql - 当使用 MySQL 的 REPEATABLE READ 隔离级别时,事务中的 SELECT 语句是否返回以前具有 INSERT/UPDATE 的行?
- c# - 如何将文件签出到默认更改列表?
- javascript - 需要在名字和姓氏之间添加一个空格
- json - 如何在codeigniter中创建json响应状态
- python - 如何从阿拉伯语字符串中删除阿拉伯语前缀“ال”?
- php - PHP、Docker、Selenium Grid:如何运行测试?
- javascript - 如何在 React JS 中解析对象的 Json 数组