现在我正在从cs 231 n开始分配,我想计算点之间的欧几里得距离:
dists[i, j]=0
for k in range(3072):
dists[i, j]+=math.pow((X[i,k] - self.X_train[j,k]),2)
dists[i, j] = math.sqrt(dists[i,j])
但是,此代码非常慢。然后我尝试了
dists[i,j] = dist = np.linalg.norm(X[i,:] - self.X_train[j,:])
,速度更快。问题是为什么? np.linalg.norm
还会遍历所有点的所有坐标,相减,赋能,求和并平方吗?有人可以给我一个详细的答案:是因为np.linalg.norm
如何访问元素还是有其他原因?
答案 0 :(得分:1)
NumPy可以一口气用优化的,加速的(例如SSE,AVX,您拥有什么)C代码完成整个计算。
原始代码在Python中完成了所有工作(除了math
函数,这些函数是用C语言实现的,而且还需要花费一些时间往返Python对象),就是这样慢一点。