2015-06-03 17 views
6

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() 
+0

nó sẽ nhanh hơn trong tương lai https://github.com/scipy/scipy/pull/5608 – endolith

Trả lời

2

Theo tài liệu, numpy.correlate được thiết kế cho mảng 1D, trong khi scipy.correlate thể chấp nhận NĐ-mảng.

Việc triển khai scipy là tổng quát hơn và do đó phức tạp, dường như thực sự phải chịu phí bổ sung tính toán. Bạn có thể so sánh mã C giữa các lần triển khai numpyscipy.

khác biệt nữa, có thể là ví dụ, rằng việc thực hiện NumPy được vector hóa tốt hơn bởi trình biên dịch trên bộ vi xử lý hiện đại, vv

Các vấn đề liên quan