纽比广播
如果不受内存限制,优化numpy中嵌套循环的第一步是使用广播并以矢量化的方式执行操作:import numpy as np
def mb_r(forecasted_array, observed_array):
"""Returns the Mielke-Berry R value."""
assert len(observed_array) == len(forecasted_array)
total = np.abs(forecasted_array[:, np.newaxis] - observed_array).sum() # Broadcasting
return 1 - (mae(forecasted_array, observed_array) * forecasted_array.size ** 2 / total[0])
但在这种情况下,循环是用C而不是Python进行的,它涉及到一个大小(N,N)数组的分配。在
广播不是灵丹妙药,试着打开内环
如上所述,广播意味着巨大的内存开销。所以它应该小心使用,而且它并不总是正确的方法。虽然你的第一印象可能是在任何地方使用它-不要。不久前我也被这个事实搞糊涂了,看我的问题Numpy ufuncs speed vs for loop speed。为了不太冗长,我将在您的示例中显示这一点:
^{pr2}$
小型阵列(广播更快)forecasted = np.random.rand(100)
observed = np.random.rand(100)
%timeit mb_r_bcast(forecasted, observed)
57.5 µs ±