【发布时间】:2015-07-15 16:44:30
【问题描述】:
我正在用下面的python代码计算欧几里得距离:
def getNeighbors(trainingSet, testInstance, k, labels):
distances = []
for x in range(len(trainingSet)):
dist = math.sqrt(((testInstance[0] - trainingSet[x][0]) ** 2) + ((testInstance[1] - trainingSet[x][1]) ** 2))
distances.append([dist, labels[x]])
distances = np.array(distances)
return distances
用于计算给定点与其他 10 个点的距离,这很好。但是当我计算一个点与其他 18563 个点的距离时,计算机会挂起,大约 3 小时没有响应。
我怎样才能更快地计算 18563 点?
【问题讨论】:
-
您可以使用
math.hypot(x, y)代替dist = math.sqrt(((testInstance[0] - trainingSet[x][0]) ** 2) + ((testInstance[1] - trainingSet[x][1]) ** 2)),以及xrange代替range -
您是否正在做任何可能需要成对距离的事情,或者您是否只计算到一个显着点的距离? 18563 个点的成对距离将需要更长的时间,这仅仅是因为要计算大约 1.72 亿个点。
-
我举一个例子,计算它与其他点的距离。
-
不要使用 for 循环来做繁重的工作(在 python 中)。要么矢量化,所以你可以 numpy 或使用不同的东西,如 cython 或 numba。
-
你能提供一个complete minimal example 而不仅仅是这个函数吗?因为如果你只调用一次,即使有 18563 个点的列表,它真的不应该花很长时间。目前尚不清楚您在在做什么需要 3 小时,但是人们可以单独对这段代码进行 5% 的小优化并没有帮助(除了将其减少到 2 小时和51 分钟)。