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

用Python计算欧几里德距离的速度太慢,python,performance,numpy,linear-algebra,euclidean-distance,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 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
for data in testing_data:
   for data2 in training_data:
       dist = euclidean_distance(data, data2)
我使用
numpy
计算两个列表之间的欧几里德距离:

def euclidean_distance(x, z):
   return np.linalg.norm(x-z)
在此之后,我计算欧几里德距离,如下所示:

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
for data in testing_data:
   for data2 in training_data:
       dist = euclidean_distance(data, data2)
我的问题是这段代码运行非常慢,大约需要10分钟才能完成。我该如何改进这一点,我缺少什么?
我必须在另一个算法中使用距离,因此速度非常重要。

您可以使用它,它允许您将工作分配给所有核心。讨论同一主题,并就
pdist
cdist
成对距离的差异进行了很好的讨论

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

dist = pairwise_distances(training_data, testing_data, n_jobs=-1)
您可以使用它将工作分配给所有核心。讨论同一主题,并就
pdist
cdist
成对距离的差异进行了很好的讨论

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

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

使用cdist-?当然,这里的复杂性是O(N*M),其中
N
M
分别是
测试数据和
培训数据的大小。因此,这取决于这两个数据集的大小。测试数据集由3823和训练数据集1797组成。所以这意味着6.869.931的距离需要计算,我不认为这需要花10分钟的时间。”福加拉辛诺伯特同意,这不算多!一种优化方法是不用手动创建
列表
,只需使用
np.fromiter(map(int,line.split('),'))
,尽管我认为这可能不会有太大的改进。另一件事可能是去掉函数
euclidean_distance()
,直接内联代码,因为它只是一行。因为我们避免了6.8M的功能,所以它可能不会带来什么提升calls@Divakar我使用了
cdist
以及使用
numpy.linalg.norm
的手动实现,在速度方面没有观察到太大的差异。使用cdist-?当然,这里的复杂性是O(N*M)其中
N
M
分别是
测试数据和
训练数据的大小。因此,这取决于这两个数据集的大小。测试数据集由3823和训练数据集1797组成。所以这意味着6.869.931的距离需要计算,我不认为这需要花10分钟的时间。”福加拉辛诺伯特同意,这不算多!一种优化方法是不用手动创建
列表
,只需使用
np.fromiter(map(int,line.split('),'))
,尽管我认为这可能不会有太大的改进。另一件事可能是去掉函数
euclidean_distance()
,直接内联代码,因为它只是一行。因为我们避免了6.8M的功能,所以它可能不会带来什么提升calls@Divakar我使用了
cdist
以及使用
numpy.linalg.norm
手动实现,在速度方面没有观察到太多差异。