微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有什么办法可以提高以下numpy代码的速度,可能是通过并行化?

如何解决有什么办法可以提高以下numpy代码的速度,可能是通过并行化?

我正在编写一个需要非常低延迟的应用程序。该应用程序将在启用了 mkl-dnn 指令/AVX 指令集的英特尔 Xenon 处理器上运行。以下代码在 intel 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)B , 我的执行时间比你的函数短 15%

但也许在更大的源阵列上,速度增益将是 更明显。自己尝试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。