【发布时间】:2017-01-22 23:30:21
【问题描述】:
以下代码遍历两个数组的每个元素以计算成对欧几里得距离。
def compute_distances_two_loops(X, Y):
num_test = X.shape[0]
num_train = Y.shape[0]
dists = np.zeros((num_test, num_train))
for i in range(num_test):
for j in range(num_train):
dists[i][j] = np.sqrt(np.sum((X[i] - Y[j])**2))
return dists
以下代码具有相同的目的,但只有一个循环。
def compute_distances_one_loop(X, Y):
num_test = X.shape[0]
num_train = Y.shape[0]
dists = np.zeros((num_test, num_train))
for i in range(num_test):
dists[i, :] = np.sqrt(np.sum((Y - X[i])**2, axis=1))
return dists
以下是两者的时间比较。
two_loop_time = time_function(compute_distances_two_loops, X, Y)
print ('Two loop version took %f seconds' % two_loop_time)
>> Two loop version took 20.3 seconds
one_loop_time = time_function(compute_distances_one_loop, X, Y)
print ('One loop version took %f seconds' % one_loop_time)
>> One loop version took 80.9 seconds
X 和 Y 都是带有形状的 numpy.ndarray -
X: (500, 3000) Y: (5000, 3000)
出于直觉,结果不正确,单循环至少应该以相同的速度运行。我在这里想念什么?
PS:结果不是一次运行。代码我跑了几次,在不同的机器上,结果都差不多。
【问题讨论】:
-
我可能在这里遗漏了一些东西,但是
self在你的one_loop函数中来自哪里?就此而言,self.X_train。 -
这是一个错字,我更正了。
-
只是为了确定,
shape和X和Y之间的不匹配是故意的还是错字? -
这是故意的。 X 是具有 Y 训练大小 10% 的测试集。
-
当数组的第二个暗度为 300 时,
one_loop快 2 倍; 3000时,反之,速度减半。第一个是 50 和 500。我猜它遇到了内存管理问题。
标签: python performance numpy time nearest-neighbor