用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
手动实现,在速度方面没有观察到太多差异。