有什么办法可以提高以下 numpy 代码的速度,可能是通过并行化?
Is there any way, the speed of the following numpy code can be increased, may be by parallelizing?
我正在编写一个需要非常低延迟的应用程序。该应用程序将在启用了 mkl-dnn instructions/AVX 指令集的英特尔 Xenon 处理器上 运行。以下代码在英特尔 9750H 处理器上执行时需要 22 毫秒。
def func(A,B):
result = 0
for ind in range(len(B)):
index = (A[:,0] <= B[ind,0]) & (A[:,1] <= B[ind,1]) & (A[:,2] <= B[ind,2])
result += ((A[index,3].sum()) * B[ind,3])
A = A[~index]
return result
%timeit func(A,B)
21.5 ms ± 509 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
有没有办法改进代码以减少执行时间。任何小于 5 毫秒的时间都很好。顺便说一下,矩阵 A 的形状为 (80000 x 4),矩阵 B 的形状为 (32 x 4)。它们都按前三列排序。我们可以并行化任何组件吗,应用程序可以使用 16 个内核。
使用以下函数代替您的函数:
def func2(A, B):
x = np.zeros(A.shape[0], dtype=int)
for bInd in range(len(B)):
x[np.where(x, False, np.all(A[:, 0:3] <= B[bInd, 0:3], axis=1))] = B[bInd, 3]
return (A[:, 3] * x).sum()
速度增益比您预期的要小。
使用形状 (10, 4) 的 A 和形状 (4 , 4),
我的执行时间比你的函数短 15 %。
但也许在更大的源阵列上速度增益会
更明显。自己试试。
我正在编写一个需要非常低延迟的应用程序。该应用程序将在启用了 mkl-dnn instructions/AVX 指令集的英特尔 Xenon 处理器上 运行。以下代码在英特尔 9750H 处理器上执行时需要 22 毫秒。
def func(A,B):
result = 0
for ind in range(len(B)):
index = (A[:,0] <= B[ind,0]) & (A[:,1] <= B[ind,1]) & (A[:,2] <= B[ind,2])
result += ((A[index,3].sum()) * B[ind,3])
A = A[~index]
return result
%timeit func(A,B)
21.5 ms ± 509 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
有没有办法改进代码以减少执行时间。任何小于 5 毫秒的时间都很好。顺便说一下,矩阵 A 的形状为 (80000 x 4),矩阵 B 的形状为 (32 x 4)。它们都按前三列排序。我们可以并行化任何组件吗,应用程序可以使用 16 个内核。
使用以下函数代替您的函数:
def func2(A, B):
x = np.zeros(A.shape[0], dtype=int)
for bInd in range(len(B)):
x[np.where(x, False, np.all(A[:, 0:3] <= B[bInd, 0:3], axis=1))] = B[bInd, 3]
return (A[:, 3] * x).sum()
速度增益比您预期的要小。 使用形状 (10, 4) 的 A 和形状 (4 , 4), 我的执行时间比你的函数短 15 %。
但也许在更大的源阵列上速度增益会 更明显。自己试试。