【问题标题】:Fast running average during data acquisition数据采集​​过程中的快速平均
【发布时间】:2020-06-12 06:43:48
【问题描述】:

我有一段代码多次遍历一个向量,执行一些计算,并将结果平均到现有数据中。此计算基于其他变量(例如时间)以及输入,因此相同的输入具有不同的输出,并且无法预先计算总结果。这看起来像这样:

output = np.zeros(50)
while loop_count < max_loops:
    for idx, dat in enumerate(vec):
        val = calculate(dat)
        averaged = (val + output[idx] * loop_count) / (1 + loop_count)
        output[idx] = averaged
    loop_count += 1

这工作正常,但似乎很慢(大约需要 9 秒)。有没有更好的解决方案,最好使用 numpy、scipy 或 pandas? vec 的长度可能很长,因此避免复制也是理想的

【问题讨论】:

  • 如果这需要大约 9 秒,那么我假设大约 95% 的时间花在 calculate 上,因为即使对于更长的向量,循环和平均也不会那么昂贵。所以我想除了尝试优化计算本身之外,这里没有什么可做的。

标签: python pandas numpy scipy


【解决方案1】:

最后你可以只计算总和然后除以max_loops,对吗?这会使它更快一点,因为您也可以就地进行求和:

output = np.zeros(50)
for idx, dat in enumerate(vec):
    for count in range(max_loop):
        output[idx] += calculate(dat)
    output[idx] /= max_loop

由于您提供了一个更抽象的示例(这很有帮助),我不确定这个重组后的版本是否适用于您的应用程序。如果calculate 中的计算真正独立于各种重复,我看不到进一步的简化。

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 2010-11-01
    • 2011-07-03
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多