python中的并行计算比常规for循环要慢得多

python中的并行计算比常规for循环要慢得多,python,numpy,parallel-processing,scipy,Python,Numpy,Parallel Processing,Scipy,所以我试着用python做一些简单的图像分析,我有一个视频的numpy数组,它的形状是(930,256,256),也就是说,930帧的分辨率是256×256像素 我正在尝试并行地进行种子像素相关,我的计算机有12个内核,所以我应该能够编写并行for循环并更快地得到结果 这是我在四处寻找为循环编写并行程序的方法之后想到的。但是,它比非并行版本要慢得多 也许有人能告诉我一个更好的写作方法?(使用其他库!) 或者有人能告诉我为什么速度慢 下面是我想到的代码: import numpy as np fr

所以我试着用python做一些简单的图像分析,我有一个视频的numpy数组,它的形状是(930,256,256),也就是说,930帧的分辨率是256×256像素

我正在尝试并行地进行种子像素相关,我的计算机有12个内核,所以我应该能够编写并行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循环的方法,它将按照迭代的顺序将其结果附加到列表中。所以我想同步可能是个问题

您可能会遇到问题,因为传递给
Parallel
的参数很大,并且都在序列化。如果(我假设)
personr
释放GIL,您可以使用
backend=“threading”
来避免这种情况。否则,您可能必须查看
numpy.memmap
并坚持使用
多处理器

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

如果pearsonr不释放GIL,是否会导致延迟?我尝试了你的建议,但它仍然比单核任务慢:(是的,它可能是IO约束的。或者根据阿姆达尔定律(B~1)必须共享IO资源。你有没有检查过你的CPU利用率,试图找出问题是否在某种程度上是IO限制的?还有你在使用什么操作系统?我在使用Ubuntu!奇怪的是,CPU没有被征税100,两者都没有。他们说大约50岁。所以问题很可能是IO…还有其他建议吗?CPU没有被征税是exa这正是你想要的。如果你正在使用ubuntu,并且还没有安装
mpstat
install
sudo-apt-get-sysstat
。请仔细查看iowait列。IO wait列在整个测试过程中保持了%0.28。。。