【发布时间】:2015-06-03 12:20:01
【问题描述】:
我比较了使用 numpy/scipy 对两个信号进行卷积/关联的不同方法。事实证明,速度存在巨大差异。我比较了以下方法:
- 从 numpy 包中关联(绘图中的 np.correlate)
- 来自 scipy.signal 包的关联(sps.correlate in plot)
- fftconvolve from scipy.signal(sps.fftconvolve in plot)
现在我当然明白 fftconvolve 和其他两个函数之间存在相当大的差异。我不明白为什么sps.correlate 比np.correlate 慢得多。有人知道为什么 scipy 使用这么慢的实现吗?
为了完整起见,这里是产生情节的代码:
import time
import numpy as np
import scipy.signal as sps
from matplotlib import pyplot as plt
if __name__ == '__main__':
a = 10**(np.arange(10)/2)
print(a)
results = {}
results['np.correlate'] = np.zeros(len(a))
results['sps.correlate'] = np.zeros(len(a))
results['sps.fftconvolve'] = np.zeros(len(a))
ii = 0
for length in a:
sig = np.random.rand(length)
t0 = time.clock()
for jj in range(3):
np.correlate(sig, sig, 'full')
t1 = time.clock()
elapsed = (t1-t0)/3
results['np.correlate'][ii] = elapsed
t0 = time.clock()
for jj in range(3):
sps.correlate(sig, sig, 'full')
t1 = time.clock()
elapsed = (t1-t0)/3
results['sps.correlate'][ii] = elapsed
t0 = time.clock()
for jj in range(3):
sps.fftconvolve(sig, sig, 'full')
t1 = time.clock()
elapsed = (t1-t0)/3
results['sps.fftconvolve'][ii] = elapsed
ii += 1
ax = plt.figure()
plt.loglog(a, results['np.correlate'], label='np.correlate')
plt.loglog(a, results['sps.correlate'], label='sps.correlate')
plt.loglog(a, results['sps.fftconvolve'], label='sps.fftconvolve')
plt.xlabel('Signal length')
plt.ylabel('Elapsed time in seconds')
plt.legend()
plt.grid()
plt.show()
【问题讨论】: