繁体   English   中英

朱莉娅 - 为什么循环更快

[英]Julia - why are loops faster

我有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)

我有两个问题:

  1. 为什么循环更快?
  2. 如果循环确实更快,是否存在模仿循环的“智能”矢量化技术? 循环的语法是丑陋和冗长的。

testVec2方法中,代码将为循环中的每个i实例分配一个临时向量来保存[iiii] 这种分配不是免费的。 您可以在计时结果中打印的分配数量中看到此证据。 您可以尝试以下方法:

function testVec3(n)
    t = [0 0 0 0]
    for i=1:n
        t .= i
    end
 end
  1. 这是引擎盖下的所有循环。 在Julia和Matlab中,矢量化表达式都被转换为循环。 最后它是所有循环。 在你的特定例子中,正如@sam所说,因为你正在分配一堆额外的数组,如果你明确地循环,你可以避免这些数组。 你仍然在Matlab中这样做的原因是,所有东西都被改组成用高性能语言(可能是C或Fortran)编写的函数,所以即使你做额外的分配也是值得的。

  2. 确实有,正如@sam所示。 是一篇博客文章,告诉您有关广播和循环融合的所有信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM