首页 > 解决方案 > 使用多处理改进矩阵运算时间

问题描述

拥有一个 2d numpy 数组,我正在执行以下操作:

rows_count = matrix.shape[0]
mr = []
for i in range(0, rows_count-1):
    for j in range(i+1, rows_count):
        mr.append(matrix[i,:] ^ matrix[j:])

它完全符合我的要求,但对于大输入数组来说太慢了。这就是为什么我想用它multiprocessing来加速我的代码:

import multiprocessing as mp
import numpy as np

pool = mp.Pool(mp.cpu_count())
mr = pool.map(np.bitwise_xor,[(matrix[i,:],matrix[j,:]) for i in range(0, rows_count-1) for j in range(i+1, rows_count)])
pool.join()
pool.close()

但是,此代码的运行速度要慢几倍。如何正确使用multiprocessing(或其他概念)来加速我的代码?

标签: pythonpython-3.xnumpypython-multiprocessing

解决方案


结帐麻木!

你的新代码看起来像这样

from numba import jit

@jit(parallel=True) #yes this decorator and flag is all it takes to run the function in parallel
def my_time_cosuming_thing(mr=[],matrix=np.array(), rows_count=matrix.shape[0])

    for i in range(0, rows_count-1):
      for j in range(i+1, rows_count):
        mr.append(matrix[i,:] ^ matrix[j:])

    return mr

创建 Numba 是为了通过尝试使它们并行运行来使 python 循环超级高效,请在http://numba.pydata.org/上查看

它也与 numpy 兼容,因此这应该会显着加快您的代码速度,它就像魔术一样,效果很好,我再也不会在没有它的情况下编写嵌套循环


推荐阅读