为什么Scipy的KDTree这么慢?

时间:2016-05-04 12:14:22

标签: python numpy scipy kdtree

我们说我有大约100组100分,并想知道哪些点在彼此的给定距离内。我有两个实现,一个使用k-d树,另一个只是成对距离:

from scipy.spatial.distance import cdist
from scipy.spatial import KDTree
from itertools import combinations
import numpy
import time

pts = [numpy.random.randn(100,2) for x in range(100)]


start = time.time()

for p1, p2 in combinations(pts,2):
    numpy.argwhere(cdist(p1, p2) < 0.5)

print(time.time() - start)


start = time.time()

trees = [KDTree(x) for x in pts]

for p1, p2 in combinations(trees,2):
    p1.query_ball_tree(p2,0.5,eps=1)

print(time.time() - start)

在我的计算机上cdist需要0.5秒,而KDTree实施需要一整分钟。构建树需要0.03秒。我希望KDTree方法更快,因为它不需要考虑每一对可能的点。

那么,我误解了什么,这可以更快地完成吗?

1 个答案:

答案 0 :(得分:5)

这是纯粹的蟒蛇。替代实现cKDTree要快得多。