使用numpy.nditer访问数组单元 实现递推计算并加速代码
实现方案
你写的逻辑属于一阶IIR递归滤波场景,纯Python循环的性能瓶颈来自解释器层面的逐次迭代开销,完全可以通过成熟的数值计算库内置函数实现提速,不需要自己手动实现nditer迭代(Python层调用nditer的性能和普通for循环差异极小,达不到提速目标)。
最优方案:调用scipy.signal.lfilter
该函数底层为C实现,专门处理这类递推计算,性能比纯Python循环高1~2个数量级,输出和你原有逻辑完全一致:
import numpy as np from scipy.signal import lfilter # 原有参数 a1 = 0.5 b0 = 3 ui_delta = np.arange(100000) # 直接调用滤波函数实现相同逻辑 ui_delta_res = lfilter([b0], [1, -a1], ui_delta)
你可以通过np.allclose(ui_delta_res, 原循环输出结果)验证结果的一致性。10万长度的数组计算耗时通常在0.2ms以内,相比原Python循环提速至少50倍。
纯numpy实现(无scipy依赖场景)
如果不想引入scipy依赖,也可以通过numpy的累积计算函数实现,性能略低于lfilter,但依旧远高于纯Python循环:
import numpy as np a1 = 0.5 b0 = 3 ui_delta = np.arange(100000) n = ui_delta.shape[0] pow_a1 = a1 ** np.arange(n) ui_delta_scaled = b0 * ui_delta res = np.cumsum(ui_delta_scaled / pow_a1) * pow_a1
内容的提问来源于stack exchange,提问作者Ernesto Avedillo Carretero
相关产品推荐
相关产品推荐

