我是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发布于 2015-09-16 13:58:30
您可以考虑使用Python到本机代码的转换器之一,例如Cython、Numba或Pythran。
例如,用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能提供类似的加速。
发布于 2015-09-16 10:27:54
每条分录都需要上一条分录,必须先计算前一条分录,然后才能计算当前分录。因此,每个条目都必须串行计算,并且不能以矢量化(即映射、并行)的方式进行计算。
https://stackoverflow.com/questions/32597294
复制相似问题