我正在用numpy
做一些向量代数,我的算法的挂钟性能看起来很奇怪。程序大致如下:
Y
(KxD),X
(NxD),T
(KxN)Y
的每一行:X
的每一行中减去Y[i]
(通过广播)T
。你知道吗然而,根据我如何执行广播,计算速度有很大的不同。考虑代码:
import numpy as np
from time import perf_counter
D = 128
N = 3000
K = 500
X = np.random.rand(N, D)
Y = np.random.rand(K, D)
T = np.zeros((K, N))
if True: # negate to enable the second loop
time = 0.0
for i in range(100):
start = perf_counter()
for i in range(K):
T[i] = np.sqrt(np.sum(
np.square(
X - Y[i] # this has dimensions NxD
),
axis=1
))
time += perf_counter() - start
print("Broadcast in line: {:.3f} s".format(time / 100))
exit()
if True:
time = 0.0
for i in range(100):
start = perf_counter()
for i in range(K):
diff = X - Y[i]
T[i] = np.sqrt(np.sum(
np.square(
diff
),
axis=1
))
time += perf_counter() - start
print("Broadcast out: {:.3f} s".format(time / 100))
exit()
每个循环的时间是单独测量的,平均执行100次。结果是:
Broadcast in line: 1.504 s
Broadcast out: 0.438 s
唯一的区别是第一个循环中的广播和减法是在线完成的,而在第二种方法中,我是在任何向量化操作之前完成的。为什么会有这么大的不同?你知道吗
我的系统配置:
np.__config__.show()
告诉我的)PS:是的,我知道这可能会进一步优化,但现在我想了解引擎盖下发生了什么。你知道吗
这不是广播问题
我还添加了一个优化的解决方案,以查看实际计算需要多长时间,而不需要大量的内存分配和释放开销。你知道吗
功能
计时
我把所有的计时都放在一个笔记本上,观察到一个非常奇怪的行为。以下代码位于一个单元格中。我还多次尝试调用timit,但在第一次执行单元格时,这并没有改变任何事情。你知道吗
单元格的第一次执行
第二次执行
相关问题 更多 >
编程相关推荐