【问题标题】:Fast Iteration of numpy arraysnumpy数组的快速迭代
【发布时间】:2015-12-12 08:56:47
【问题描述】:

我是 python 新手,正在尝试做一些基本的信号处理工作,但遇到了严重的性能问题。是否有以矢量化方式执行此操作的 python 技巧?基本上我正在尝试实现一阶滤波器,但滤波器特性可能会从一个样本变为下一个样本。如果它只是一个过滤器,我会使用 numpy.signal.lfilter(),但这有点棘手。这是运行非常缓慢的代码的 sn-p:

#filter state
state = 0

#perform filtering
for sample in amplitude:
    if( sample == 1.0 ): #attack filter
        sample = (1.0 - att_coeff) * sample + att_coeff * state
    else: #release filter
        sample = (1.0 - rel_coeff) * sample + rel_coeff * state

    state = sample

【问题讨论】:

    标签: python arrays numpy filtering signal-processing


    【解决方案1】:

    您可以考虑使用其中一种 Python 到本机代码的转换器, 如CythonNumbaPythran

    例如,使用 timeit 运行您的原始代码会给我:

    $ python -m timeit -s 'from co import co; import numpy as np; a = np.random.random(100000)' 'co(a, .5, .7)'
    10 loops, best of 3: 120 msec per loop
    

    同时使用 Pythran 对其进行注释,如:

    #pythran export co(float[], float, float)
    def co(amplitude, att_coeff, rel_coeff):
        # filter state
        state = 0
    
        # perform filtering
        for sample in amplitude:
            if sample == 1.0: # attack filter
                state = (1.0 - att_coeff) * sample + att_coeff * state
            else:             # release filter
                state = (1.0 - rel_coeff) * sample + rel_coeff * state
        return state
    

    并用它编译

    $ pythran co.py
    

    给我:

    $ python -m timeit -s 'from co import co; import numpy as np; a = np.random.random(100000)' 'co(a, .5, .7)' 
    1000 loops, best of 3: 253 usec per loop
    

    这大约是 x470 的加速! 我希望 Numba 和 Cython 能够提供类似的加速。

    【讨论】:

      【解决方案2】:

      每个条目都需要上一个条目,并且必须先计算上一个条目,然后才能计算当前条目。因此,每个条目都必须按顺序计算,并且不能以矢量化(即映射、并行)方式进行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 2011-10-03
        • 2019-01-30
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多