Scipy的关联功能很慢
Scipy's correlate function is slow
我已经使用 numpy/scipy 比较了 convolving/correlating 两个信号的不同方法。事实证明,速度存在巨大差异。我比较了以下方法:
- 从 numpy 包关联(np.correlate 在图中)
- 与 scipy.signal 包相关(图中 sps.correlate)
- fftconvolve 来自 scipy.signal(sps.fftconvolve 图中)
现在我当然明白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()
我已经使用 numpy/scipy 比较了 convolving/correlating 两个信号的不同方法。事实证明,速度存在巨大差异。我比较了以下方法:
- 从 numpy 包关联(np.correlate 在图中)
- 与 scipy.signal 包相关(图中 sps.correlate)
- fftconvolve 来自 scipy.signal(sps.fftconvolve 图中)
现在我当然明白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()