想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍

kal*_*rst 1 python performance numpy scipy matrix-multiplication

这是我的代码

import numpy as np
import time
from scipy.spatial import distance

y1=np.array([0,0,0,0,1,0,0,0,0,0])
y2=np.array([0. , 0.1, 0. , 0. , 0.7, 0.2, 0. , 0. , 0. , 0. ])

start_time = time.time()
for i in range(1000000):
    distance.sqeuclidean(y1,y2)
print("--- %s seconds ---" % (time.time() - start_time))
Run Code Online (Sandbox Code Playgroud)

---15.212640523910522 秒---

start_time = time.time()
for i in range(1000000):
    np.sum((y1-y2)**2)
print("--- %s seconds ---" % (time.time() - start_time))
Run Code Online (Sandbox Code Playgroud)

---8.381187438964844---秒

我认为 Scipy 是经过优化的,所以它应该更快。

任何意见将不胜感激。

Ehs*_*san 6

这是一个更全面的比较(归功于@Divakar 的benchit软件包):

def m1(y1,y2):
  return distance.sqeuclidean(y1,y2)

def m2(y1,y2):
  return np.sum((y1-y2)**2)

in_ = {n:[np.random.rand(n), np.random.rand(n)] for n in [10,100,1000,10000,20000]}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

scipy 对于更大的数组变得更有效。对于较小的数组,调用该函数的开销很可能超过其收益。根据消息来源,scipy 计算np.dot(y1-y2,y1-y2)

如果你想要一个更快的解决方案,np.dot直接使用而不需要额外的行和函数调用的开销:

def m3(y1,y2):
  y_d = y1-y2
  return np.dot(y_d,y_d)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明