没有基准就没有优化!所以这里有一些建议的解决方案和性能度量。初始化代码为:N = 2000;
nk = 10;
where = false([N, N]);
where(1:100, 1:100) = 1;
data = (5.+j)*ones([N, N, nk]);
我用函数timeit对函数计时,如下所示:
^{pr2}$
作为比较,当我对问题中给出的Numpy函数执行完全相同的操作时,它的运行速度是0.0167s
带有2个循环的初始Matlab函数运行时间约为0.34秒,等效Numpy函数(有2个循环)运行速度较慢,运行时间为0.42秒。这可能是因为Matlab使用JIT编译。在
我可以删除reshape,因为find已经返回了线性索引。我喜欢它,因为代码更简洁,但是reshape无论如何都非常便宜,因此它并不能真正提高函数的性能:function dealiasing2d(where, data)
[n1, n0, nk] = size(data);
N = n0*n1;
ind_zeros = find(where);
for ik=1:nk
data(ind_zeros + N*(ik-1)) = 0;
end
这个函数需要0.23秒,比有两个循环的解决方案快,但与Numpy解决方案相比非常慢(慢14倍!)。这就是我写问题的原因。在
这个解决方案涉及N*N*nk乘法(乘1或0),这显然是太多的工作,因为我们只需将100*100*nk值放入数组