采用大量点积的更好方法是什么?

时间:2016-07-31 19:01:31

标签: 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

但是当我跑步时

@time foo()

我得到了

0.001010 seconds (20.00 k allocations: 1.831 MB)

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

1 个答案:

答案 0 :(得分: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)