<p>首先要明确的是:我不知道如何使用numpy使其更快。所以这不是你问题的答案</p>
<p>但是:您可以使用<code>numba</code>实现一些加速:</p>
<pre><code>from numba import jit
import numpy as np
N = 1000000
x = np.random.rand(N)
y = np.random.rand(N)
gamma = np.random.rand(N)
chi = np.random.rand(N)
a = [.2]
b = [.3]
alpha = [a[0]]
beta = [b[0]]
def compute_in_python():
for i in range(len(x)):
a.append(-alpha[i]*x[i] + beta[i]*y[i]*gamma[i])
b.append(-beta[i]*y[i] + alpha[i]*x[i]*chi[i])
alpha.append(alpha[-1]+a[-1])
beta.append(beta[-1]+b[-1])
@jit(nopython=True)
def compute_with_numba(x,y,gamma,chi,a0, b0, alpha0, beta0):
N = len(x)
a = np.empty(N+1)
b = np.empty(N+1)
alpha = np.empty(N+1)
beta = np.empty(N+1)
a[0] = a0
b[0] = b0
alpha[0] = alpha0
beta[0] = beta0
for i in range(N):
a[i+1] = -alpha[i] * x[i] + beta[i] * y[i] * gamma[i]
b[i+1] = -beta[i] * y[i] + alpha[i] * x[i] * chi[i]
alpha[i+1] = alpha[i]+a[i+1]
beta[i+1] = beta[i]+b[i+1]
return a,b,alpha,beta
</code></pre>
<p>普通python循环:</p>
<pre class="lang-py prettyprint-override"><code>In [23]: %time compute_in_python()
CPU times: user 1.6 s, sys: 24.8 ms, total: 1.63 s
Wall time: 1.63 s
</code></pre>
<p>麻木紧张:</p>
<pre class="lang-py prettyprint-override"><code>In [42]: %time res = compute_with_numba(x,y,gamma,chi,a[0], b[0], alpha[0], beta[0])
CPU times: user 13 ms, sys: 3.36 ms, total: 16.4 ms
Wall time: 16.4 ms
</code></pre>
<p>请注意,对<code>compute_with_numba</code>的第一个调用将触发jit,因此您应该测量第二个调用的运行时</p>
<p>同样,这不是你问题的答案,但它仍然快了大约100倍</p>