所以我试图在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循环的方法,该循环将按迭代顺序将其结果附加到列表中。所以我认为同步可能是一个问题!
答案 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)