python中的并行计算明显慢于循环

时间:2015-08-02 17:12:00

标签: python numpy parallel-processing scipy

所以我试图在python中做一些简单的图像分析,我有一个有问题的视频的numpy数组,它的形状为(930,256,256),即分辨率为256的930帧256像素。

我正在尝试并行进行种子像素关联,我的计算机有12个内核,因此我应该能够编写并行for循环并更快地获得结果。

这是我在寻找编写并行for循环的方法之后想出的。但是,它比非并行版本明显要慢!!

也许有人可以告诉我一个更好的写作方式? (使用其他库!) 或者有人可以告诉我为什么它会变慢?

这是我提出的代码:

import numpy as np
from scipy.stats.stats import pearsonr
from joblib import Parallel, delayed  
import multiprocessing

def corr(pixel, seed_pixel):
    return pearsonr(pixel, seed_pixel)[0]

def get_correlation_map(seed_x, seed_y, frames):
    seed_pixel = np.asarray(frames[:, seed_x, seed_y], dtype=np.float32)

    # Reshape into time and space
    frames = np.reshape(frames, (total_number_of_frames, width*height))
    #correlation_map = []
    #####################################
    print 'Getting correlation...'

    # The parallel version.
    correlation_map = Parallel(n_jobs=12)(delayed(corr)(pixel, seed_pixel) for pixel in frames.T)

    # Non parallel version
    #correlation_map = []
    #for i in range(frames.shape[-1]):
        #correlation_map.append(pearsonr(frames[:, i], seed_pixel)[0])
    #####################################
    correlation_map = np.asarray(correlation_map, dtype=np.float32)
    correlation_map = np.reshape(correlation_map, (width, height))
    print np.shape(correlation_map)

    return correlation_map

我需要的是一种并行化for循环的方法,该循环将按迭代顺序将其结果附加到列表中。所以我认为同步可能是一个问题!

1 个答案:

答案 0 :(得分:1)

您可能遇到问题,因为传递给Parallel的参数很大且都被序列化了。如果(我假设)backend="threading"释放GIL,您可以使用personr来避免这种情况。否则,您可能需要查看numpy.memmap并坚持使用multiprocessor

correlation_map = Parallel(n_jobs=12, backend="threading")(delayed(corr)(pixel, seed_pixel) for pixel in frames.T)