【发布时间】:2015-08-02 17:12:00
【问题描述】:
所以我正在尝试在 python 中进行一些简单的图像分析,我有一个有问题的视频的 numpy 数组,它的形状为 (930, 256, 256),即 930 帧,分辨率为 256 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 循环的方法,该循环将按迭代顺序将其结果附加到列表中。所以我想同步可能是个问题!
【问题讨论】:
-
您是否查看过您的 CPU 利用率以尝试找出问题是否与某种方式的 IO 绑定有关?还有你用的是什么操作系统?
-
我正在使用 Ubuntu!奇怪的是,CPU 没有按 100 征税,两者都没有。他们说50年代左右。所以问题很可能是 IO ......还有其他建议吗?
-
CPU 没有被征税正是您想要的。如果您使用的是 ubuntu 并且还没有
mpstat安装sudo apt-get sysstat。仔细查看 iowait 列。 -
IO 等待列在整个测试运行过程中保持 %0.28...
标签: python numpy parallel-processing scipy