使用多处理缩短矩阵运算时间

时间:2018-10-30 14:24:58

标签: python python-3.x numpy python-multiprocessing

具有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(或其他概念)来加快代码的速度?

1 个答案:

答案 0 :(得分:0)

结帐numba!

您的新代码看起来像这样

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循环并行运行来提高python循环的效率,并在http://numba.pydata.org/处进行检查

它也与numpy兼容,因此应该可以大大加快代码的运行速度,就像魔术一样,效果很好,我再也没有写嵌套循环了