问题描述
我很好奇为什么以下cdist
在时间上会有如此大的差异,即使它们产生相同的结果:
import numpy as np
from scipy.spatial.distance import cdist
x = np.random.rand(10_000_000,50)
y = np.random.rand(50)
result_1 = cdist(x,y[np.newaxis,:])
result_2 = cdist(x,:],`minkowski`,p=2.)
result_1
比result_2
快得多。
解决方法
欧几里得距离source lines 50-66的C实现使用乘法和sqrt()
调用,而Minkowski距离source lines 381-391基于对{{1}的慢得多的调用}功能。
作为参考,请参阅讨论here和here,将pow()
与乘法和pow
进行比较。
因此,尽管看起来欧几里得规范只是调用Minkowski规范,source line 614,sqrt
实际上calls directly through到代码不同的C实现。实际执行中未调用python cdist
函数。