我是朱莉娅的新手,并不是非常擅长编程,对不起,如果有一个我错过的明显答案。 我正在尝试进行计算,其中涉及使用三个元素的矢量的大量点积,比如说,
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分钟并分配千兆字节的内存。我觉得 喜欢它不应该分配这么多。我错了?有没有更好的方法来做到这么多,分配不那么多,可能会更快?
答案 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)