@numba.jit("float64(float64[:,:])")
def sum_of_squares_numba(a):
sum = 0
n_y, n_x = a.shape
for i in range(n_y):
for j in range(n_x):
sum += a[i, j] * a[i, j]
return sum
@numba.jit("float64(float64[:, :])", parallel=True)
def sum_of_squares_numba_parallel(a):
sum = 0
n_rows, n_cols = a.shape
for i in numba.prange(n_rows):
for j in range(n_cols):
sum += a[i, j] * a[i, j]
return sum
1条答案
按热度按时间gywdnpxw1#
测试hpaulj问题注解中的答案。添加简单的替代-
np.sum(A**2)
和两个numba函数:单CPU和并行。TLDR:最快的是
sum_of_squares_numba_parallel
功能。最快的numpy唯一解决方案:np.einsum('ij,ij',A,A)
使用line profiler的粗略计时显示,
np.einsum('ij,ij',A,A)
在numpy only结果方面显然是赢家。可能是因为它不必在内存中创建迭代A*A结果,然后访问它来计算sum。Numba单CPU计算也不远了,也许可以做得更好。
sum_of_squares_numba_parallel
是目前最快的版本。在我的机器上比einsum快3-4倍。