我有一个用 Julia 编写的模拟程序,它在主循环中执行与此相同的操作:
# Some fake data
M = [randn(100,100) for m=1:100, n=1:100]
W = randn(100,100)
work = zip(W,M)
result = mapreduce(x -> x[1]*x[2], +,work)
Run Code Online (Sandbox Code Playgroud)
换句话说,就是加权矩阵的简单求和。对上述代码进行计时,得出
0.691084 seconds (79.03 k allocations: 1.493 GiB, 70.59% gc time, 2.79% compilation time)
Run Code Online (Sandbox Code Playgroud)
我对大量的内存分配感到惊讶,因为这个问题应该可以就地解决。为了看看我对mapreduce的使用是否错误,我还测试了以下等效实现:
@time begin
res = zeros(100,100)
for m=1:100
for n=1:100
res += W[m,n] * M[m,n]
end
end
end
Run Code Online (Sandbox Code Playgroud)
这给了
0.442521 seconds (50.00 k allocations: 1.491 GiB, 70.81% gc time)
Run Code Online (Sandbox Code Playgroud)
因此,如果我用 C++ 或 Fortran 编写此代码,那么就地完成所有这些操作就会很简单。这在朱莉娅身上不可能吗?或者我在这里遗漏了什么......?