使用Numpy和Joblib在Python中进行并行化

时间:2016-10-30 21:01:59

标签: python matlab numpy parallel-processing joblib

我想从MATLAB转向开源替代品,如scipy和numpy。但是,我的速度有些问题。我知道有时多核操作比单核更慢,但是,我试图做一个实际上由MATLAB加速的过程。

我有一个函数可以对2D矩阵的每个像素进行一些数学运算。我使用3个嵌套循环来做到这一点。

def reconstruct2D(frame, parameters):
    """
    Does some nested for loop operations on 2D data
    """
    for channel_i in range(nr_cols):  # for every channel
        for y in range(nr_rows):
            for x in range(nr_cols):
                # Do some calculations here

我在MATLAB中通常做的是为3D矩阵的每个第三个维度调用此函数。

parfor frameNo = 1:N
    result(:,:,frameNo) = reconstruct2D(rawFrame(:,:,frameNo), parameters);
end

当4核处于活动状态时,它变快四倍。但是,当我通过使用Joblib尝试相同的事情时,它仍然按顺序执行。

import numpy as np
from scipy import signal
from joblib import Parallel, delayed


def reconstruct2D(frame, parameters):
    # Same as above

if __name__ == '__main__':
    print('Main Loop is running...')
    Parallel(n_jobs=4)(delayed(reconstruct2D(frame[:, :, indx], parameters)) for indx in range(N))
    print('Main Loop is finished...')

Python中单帧的处理时间也要慢得多。它在MATLAB中需要1.8s,在Python中需要19s。

我基本上有两个问题:

  1. 有没有人知道单帧处理在Python中慢10倍的原因?
  2. 为什么joblib按顺序计算帧而不是同时计算?
  3. 我使用的是带有4核的Windows7 64位硬件中的Python 3.5。

0 个答案:

没有答案