我有一个向量数组,并计算它们与第一个向量的差的范数。 使用Python广播时,计算速度比通过简单循环进行计算慢得多。为什么?
import numpy as np
def norm_loop(M, v):
n = M.shape[0]
d = np.zeros(n)
for i in range(n):
d[i] = np.sum((M[i] - v)**2)
return d
def norm_bcast(M, v):
n = M.shape[0]
d = np.zeros(n)
d = np.sum((M - v)**2, axis=1)
return d
M = np.random.random_sample((1000, 10000))
v = M[0]
%timeit norm_loop(M, v)
25.9 ms
%timeit norm_bcast(M, v)
38.5 ms
我有 Python 3.6.3 和 Numpy 1.14.2。
在 Google Colab 上运行示例的方法如下: https://drive.google.com/file/d/1GKzpLGSqz9eScHYFAuT8wJt4UIZ3ZTru/view?usp=sharing。
d[i] = np.linalg.norm(M[i] - v)
,你可以节省更多时间。奇怪的是,我用einsum得到的结果比较慢。可能是由于OpenBLAS的原因。 - percusse