Tôi đã so sánh các phương pháp khác nhau để liên kết/tương quan hai tín hiệu sử dụng numpy/scipy. Nó chỉ ra rằng có sự khác biệt rất lớn về tốc độ. Tôi đã so sánh các phương pháp follwing:Chức năng tương quan của Scipy là chậm
- tương quan từ gói NumPy (np.correlate trong cốt truyện)
- tương quan từ gói scipy.signal (sps.correlate trong cốt truyện)
- fftconvolve từ scipy.signal (sps.fftconvolve in plot)
Bây giờ, tất nhiên tôi hiểu rằng có sự khác biệt đáng kể giữa fftconvolve và hai hàm còn lại. Những gì tôi không hiểu là tại sao sps.correlate chậm hơn rất nhiều so với np.correlate. Có ai biết tại sao scipy sử dụng một thực hiện đó là chậm hơn rất nhiều?
Speed comparison http://i62.tinypic.com/ofrqxc.png
Để hoàn chỉnh, đây là mã mà tạo ra cốt truyện:
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()
nó sẽ nhanh hơn trong tương lai https://github.com/scipy/scipy/pull/5608 – endolith