我有MATLAB的背景,所以我倾向于对所有内容进行矢量化。但是,在Julia,我测试了这两个函数:
function testVec(n)
t = [0 0 0 0];
for i = 1:n
for j = 1:4
t[j] = i;
end
end
end
function testVec2(n)
t = [0 0 0 0];
for i = 1:n
t.= [i i i i];
end
end
@time testVec(10^4)
0.000029 seconds (6 allocations: 288 bytes)
@time testVec2(10^4)
0.000844 seconds (47.96 k allocations: 1.648 MiB)
我有两个问题:
答案 0 :(得分:4)
在testVec2
方法中,代码将为循环中的[i i i i]
的每个实例分配一个临时向量来保存i
。这种分配不是免费的。您可以在计时结果中打印的分配数量中看到此证据。您可以尝试以下方法:
function testVec3(n)
t = [0 0 0 0]
for i=1:n
t .= i
end
end
答案 1 :(得分:4)
引擎盖下的所有循环。在Julia和Matlab中,矢量化表达式都被转换为循环。最后,它是所有循环。在你的特定例子中,就像@sam所说的那样,因为你要分配一堆额外的数组,如果你明确地循环,你可以避免这些数组。你仍然在Matlab中这样做的原因是,所有东西都被改组成用高性能语言(可能是C或Fortran)编写的函数,所以即使你做额外的分配也是值得的。
确实有,正如@sam所示。 Here是一篇博客文章,告诉您有关广播和循环融合的所有信息。