【问题标题】:Speed up Python/Numpy code [duplicate]加速 Python/Numpy 代码 [重复]
【发布时间】:2015-12-11 21:41:23
【问题描述】:

以下代码计算整个图片的局部对比度。而且我的版本真的很慢。我尝试使用“多处理”模块中的“池”进行多线程处理,但它只加快了 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)]

【问题讨论】:

  • 您知道将所有内容放在一条线上实际上并不能加快速度。
  • 您确定这是您正在运行的代码吗?我猜你错过了[。如果您指定变量/数组的值/维度(例如pic)也会有所帮助,因为加速通常取决于数组形状。

标签: python performance numpy


【解决方案1】:

最直接的方法是:

from skimage.util import view_as_windows

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

这会将图片分解为一个包含所有窗口的数组,但不会产生额外的内存开销。优点是您摆脱了 Python 循环/函数调用开销。它基于 Numpy “步幅技巧”,请参阅实现 here(或 scikit-learn variant)。

有一种方法可以更好地扩展,请在此处查看答案:improving code efficiency: standard deviation on sliding windows

【讨论】:

    猜你喜欢
    • 2018-02-27
    • 2019-07-10
    • 1970-01-01
    • 2013-10-12
    • 2018-02-18
    • 2018-03-15
    • 2023-04-10
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多