加速Python / Numpy代码

时间:2015-09-15 14:59:39

标签: python performance numpy

以下代码计算整个图片的局部对比度。我的版本非常慢。我尝试使用'multiprocessing'模块中的'pool'进行多线程处理,但它只加速了10% 你能帮助我加快速度吗?

#pic: gray value picture (large 2d-array)
#xvar,yvar: scalar values, e.g. 200

contrast=[np.std(pic[stepx-xvar:xvar+stepx:,stepy-yvar:yvar+stepy:])*2 \
          for ystep in np.arange(yvar,np.int(pic.shape[1]-yvar),1)] \
          for stepx in np.arange(xvar,np.int(pic.shape[0]-xvar),1)]

1 个答案:

答案 0 :(得分:0)

最直接的方式是:

from skimage.util import view_as_windows

windows = view_as_windows(pic, (xvar, yvar))
contrast = 2 * np.std(windows, axis=(2,3))

这会将图片炸成一个包含所有窗口的数组,但不会产生额外的内存开销。优点是你摆脱了Python循环/函数调用开销。它基于Numpy" stride-trick",请参阅实施here(或者scikit-learn variant)。

有一种方法可以更好地扩展,但请参阅此处的答案:improving code efficiency: standard deviation on sliding windows