3

我很好奇为什么以下内容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, y[np.newaxis, :], `minkowski`, p=2.)

result_1明显快result_2于。

4

1 回答 1

2

欧几里得距离的 C 实现,源代码行 50-66,使用乘法和sqrt()调用,而 Minkowski 距离,源代码行 381-391基于对pow()函数的慢得多的调用。

作为参考,请参阅此处此处pow的讨论,与乘法和进行比较sqrt

因此,尽管看起来欧几里得范数只是调用了 Minkowski 范数,但源代码行 614cdist实际上直接调用了代码不同的 C 实现。euclidean实际执行中不调用python函数。

于 2020-09-24T11:49:17.630 回答