我想从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 .
我基本上有两个问题:
-
有没有人知道单帧处理在Python中慢10倍的原因?
-
为什么joblib按顺序计算帧而不是同时计算?
我使用的是带有4个内核的Windows7 64位硬件中的Python 3.5 .