晚上好,
我试图加快这段代码中的循环.我已经阅读了numpy docs,但无济于事.np.accumulate看起来几乎是我需要的,但并不完全.
我该怎么做才能加快循环速度?
import numpy as np N = 1000 AR_part = np.random.randn(N+1) s2 = np.ndarray(N+1) s2[0] = 1.0 beta = 1.3 old_s2 = s2[0] for t in range( 1, N+1 ): s2_t = AR_part[ t-1 ] + beta * old_s2 s2[t] = s2_t old_s2 = s2_t
为了回应沃伦,我更新了我的代码:
从scipy.signal import lfilter,lfiltic导入numpy as np
N = 1000 AR_part = np.random.randn(N+1) beta = 1.3 def method1( AR_part): s2 = np.empty_like(AR_part) s2[0] = 1.0 old_s2 = s2[0] for t in range( 1, N+1 ): s2_t = AR_part[ t-1 ] + beta * old_s2 s2[t] = s2_t old_s2 = s2_t return s2 def method2( AR_part): y = np.empty_like(AR_part) b = np.array([0, 1]) a = np.array([1, -beta]) # Initial condition for the linear filter. zi = lfiltic(b, a, [1.0], AR_part[:1]) y[:1] = 1.0 y[1:], zo = lfilter(b, a, AR_part[1:], zi=zi) return y s2 = method1( AR_part ) y = method2( AR_part ) np.alltrue( s2==y )
定时代码:
%timeit method1( AR_part ) 100 loops, best of 3: 1.63 ms per loop %timeit method2( AR_part ) 10000 loops, best of 3: 129 us per loop
这表明沃伦的方法快了10倍!非常令人印象深刻!