使用Python计算欧几里得距离的速度太慢

时间:2019-05-06 13:32:55

标签: python performance numpy linear-algebra euclidean-distance

我将文件中的数据集读取到numpy数组中,如下所示:

def read_data(filename):
   data = np.empty(shape=[0, 65], dtype=int)
   with open(filename) as f:
       for line in f:
           data = np.vstack((data, np.array(list(map(int, line.split(','))), dtype=int)))
   return data

我使用numpy来计算两个列表之间的欧式距离:

def euclidean_distance(x, z):
   return np.linalg.norm(x-z)

在此之后,我像这样计算欧几里德距离:

for data in testing_data:
   for data2 in training_data:
       dist = euclidean_distance(data, data2)

我的问题是这段代码运行非常缓慢,大约需要10分钟才能完成。我该如何改善呢?我想念什么?
我必须在另一个算法中使用距离,因此速度非常重要。

1 个答案:

答案 0 :(得分:1)

您可以使用sklearn.metrics.pairwise_distances,它可以将工作分配到所有核心。 Parallel construction of a distance matrix讨论了同一主题,并对pdistcdistpairwise_distances

的区别进行了很好的讨论。

如果我正确理解了您的示例,则需要训练集中的每个样本与测试集中的每个样本之间的距离。为此,您可以使用:

dist = pairwise_distances(training_data, testing_data, n_jobs=-1)