numpy数组的快速迭代

7

我刚接触Python,试图做一些基本的信号处理工作,但是遇到了严重的性能问题。有没有一种Python技巧可以向量化地完成这个任务?基本上,我正在尝试实现一个一阶滤波器,但是滤波器特性可能会从一个样本变为另一个样本。如果只有一个滤波器,我会使用numpy.signal.lfilter(),但这有点棘手。以下是代码片段,速度非常慢:

#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
2个回答

7
你可以考虑使用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也能提供类似的加速。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接