采取大量点积的更好方法?

Tim*_*iel 3 optimization julia

我是朱莉娅的新手,并不是非常擅长编程,如果有一个我错过的明显答案,对不起.我正在尝试进行计算,包括使用三个元素的矢量的大量点积,比如这样,

 function foo()
  z = 0.0
  for i in 1:10000
   z = dot([0.0, 1.0, 0.0], [1.0, 0.0, 0.0])
  end
 end
Run Code Online (Sandbox Code Playgroud)

但是当我跑步的时候

@time foo()
Run Code Online (Sandbox Code Playgroud)

我明白了

0.001010 seconds (20.00 k allocations: 1.831 MB)
Run Code Online (Sandbox Code Playgroud)

这似乎是这个计算的大量分配,并考虑到我需要运行它不是10000时间但更接近10 ^ 9,这需要大约5分钟并分配千兆字节的内存.我觉得它不应该分配那么多.我错了?有没有更好的方法来做这个不分配太多,可能更快?

Dav*_*ers 9

分配来自于[1.0, 0.0, 0.0]每次创建数组的事实.如果从循环中删除此创建,它的行为与您期望的一样:

function foo2(N=10^4)
    a, b = [0.0, 1.0, 0.0], [1.0, 0.0, 0.0]
    z = 0.0

    for i in 1:N
        z += dot(a, b)
    end

    return z
end

@time foo2()
0.000199 seconds (7 allocations: 368 bytes)

@time foo2(10^7)
0.179523 seconds (8 allocations: 384 bytes)
Run Code Online (Sandbox Code Playgroud)