【问题标题】:Python - Optimize Lambda with Numpy OperationsPython - 使用 Numpy 操作优化 Lambda
【发布时间】:2020-06-24 00:54:05
【问题描述】:

我很难优化以下计算;

Inner_diff_grp  = np.var(list(map(lambda x : np.percentile(winw2_grp,x[0]) - np.percentile(winw2_grp,x[1])  ,[(i+7,i) for i in range(0,98,7)])))

'winw2_grp' 是一个小型图像数组(比如 5x5)。我在图像中循环查找每 7 步的百分位值,然后计算这些值的方差。

循环中的总图像约为 100,000。之前我使用的是标准循环,但现在我已将其更改为 Pandas.apply,它似乎表现更好,吞吐量现在约为 150 次迭代/秒 - 这仍然意味着超过 10 分钟的运行时间。

除了尝试使用池来利用所有 CPU 之外,有没有办法优化这个计算?

【问题讨论】:

  • 我知道 pandas 是基于 numpy 的,但是你在纯 numpy 上尝试过同样的事情吗?也许 numba 也可以提供帮助。
  • 感谢 Ehsan,它实际上解决了这个问题。我从移植到 numba 的一小块开始,它跃升至 350 iter/sec 左右。但是,一旦我将所有内容都移植到 numba func,它现在的速度约为 4000 iter/sec。 Numba 是一颗宝石。非常感谢!
  • 很高兴它有帮助。如果您可以在此处分享您的代码作为解决方案,那就太好了,以防其他人面临问题。谢谢。

标签: python pandas numpy optimization


【解决方案1】:

因此,根据@Ehsan 的建议,我将计算封闭在一个带有 numba 装饰器的单独函数中,仅此而已。我故意删除了 lambda,因为我想尝试其他优化(并行执行) - 所以它不是策略的一部分,而是 WIP。

@nb.jit(nopython = True, fastmath=True)
def numba_perc_calc(win):
    arr = [0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]
    perc = np.percentile(win,arr)
    dif = np.diff(perc )
    var_of_percs = np.var(dif )
    return var_of_percs

跟随较小测试集上的一块结果。

【讨论】:

  • 是的,在没有循环的情况下运行代码非常快。我尝试使用 prange,但它有其自身的局限性。
猜你喜欢
  • 2021-11-13
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多