Python numpy阵列的快速迭代

Python numpy阵列的快速迭代,python,arrays,numpy,filtering,signal-processing,Python,Arrays,Numpy,Filtering,Signal Processing,我是python新手,我正在尝试做一些基本的信号处理工作,我遇到了严重的性能问题。有没有python技巧可以以矢量化的方式实现这一点?基本上,我试图实现一阶滤波器,但滤波器特性可能会随着一个样本的变化而变化。如果它只是一个过滤器,我会使用numpy.signal.lfilter(),但它有点复杂。下面是一段进展非常缓慢的代码: #filter state state = 0 #perform filtering for sample in amplitude: if( sample =

我是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

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

> P>您可以考虑使用Python中的一个到本机代码转换器, 比如,, 或者

例如,使用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)'
10 loops, best of 3: 120 msec per loop
$ 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能提供类似的加速