2015-09-15 99 views
7

我是新来的python,我试图做一些基本的信号处理的东西,我有一个严重的性能问题。以矢量化的方式执行此操作有没有python技巧?基本上我试图实现一阶滤波器,但滤波器特性可能会从一个采样到另一个采样。如果它只是一个过滤器,我会使用numpy.signal.lfilter(),但它有点棘手。以下是代码片段非常缓慢:numpy阵列的快速迭代

#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 

回答

0

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

7

您可以考虑在cython,numbapythran之间使用python-to-native- code转换器之一。

例如,对于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次循环,最好的3:每循环

253微秒,这是一个大约470 X加速,我希望Numba并用Cython给类似的加速!