<p>我不确定哪些循环比Python中的其他循环快,但正如我在代码中看到的,有一些重复的函数调用(相同的参数)</p>
<p>例如:</p>
<pre><code>A_mn = A_mn / (2**n * math.factorial(n))
B_mn = B_mn / (2**n * math.factorial(n))
</code></pre>
<p>两个声明共享相同的分母。首先尝试计算阶乘,将其保存到变量中并将其用作分母</p>
<p>此外,还会多次调用np.exp()函数,所有函数都使用相同的参数:</p>
<pre><code>np.exp(-1j*a)/(a)
np.exp(1j * m * matrix_b)
</code></pre>
<p>Numpy指数函数的执行时间可能会有点慢</p>
<p>所有np.sin/np.cos(matrix_a)调用都会发生同样的情况</p>
<p>这些更改不会给您带来巨大的改进,但它是:</p>
<pre><code>def function_call_2(npp,nmax):
matrix_a = np.random.rand(npp)
matrix_b = np.random.rand(npp)
a=np.random.rand()
F = np.zeros((2*npp, 2*nmax*(nmax+2)),dtype=np.complex_)
npa=np.arange(npp)
# Auxiliary variables
sin_matrix_a = np.sin(matrix_a)
cos_matrix_a = np.cos(matrix_a)
for n in range(1,nmax+1,1):
# Auxilary variables
denominator = (2**n * math.factorial(n))
a_n = np.sqrt(1 / (2 * np.pi * n * (n + 1)))
for m in range(-n,n+1,1):
b_m = (-1)**((np.abs(m) + m) / 2)
p_mn = int(1 / 2 * (np.abs(m) + n + 1 / 2 * (1 - (-1)**(np.abs(m) + n))))
alpha_mn = np.sqrt(((2 * n + 1) / 2) * math.factorial(n - np.abs(m)) / math.factorial(n + np.abs(m)))
A_mn = np.zeros(npp)
B_mn = np.zeros(npp)
for p in range(p_mn,n+1,1):
Cai_pmn = math.factorial(n) * ((-1)**(n + p)) / (math.factorial(p) * math.factorial(n - p)) * math.factorial(2 * p)/math.factorial(2 * p - np.abs(m) - n)
A_mn = A_mn + Cai_pmn * (cos_matrix_a)**(2 * p - np.abs(m) - n)
B_mn = B_mn + (2 * p - np.abs(m) - n) * Cai_pmn * (cos_matrix_a)**(np.abs(2 * p - np.abs(m) - n - 1))
A_mn = A_mn / denominator
B_mn = B_mn / denominator
S_mn = alpha_mn * m * A_mn * sin_matrix_a**np.abs(np.abs(m) - 1)
D_mn = alpha_mn * (np.abs(m) * A_mn * cos_matrix_a * (sin_matrix_a)**(np.abs(np.abs(m) - 1)) - B_mn * (sin_matrix_a)**(np.abs(m) + 1))
# Auxilary variables
np_exp_1 = np.exp(-1j*a)/(a)
np_exp_2 = np.exp(1j * m * matrix_b)
h1 = 1j**(n+1)*np_exp_1
h2 = 1j**(n)*np_exp_1
F_s1_theta = 1j * a_n * b_m * h1 * (S_mn * np_exp_2)
F_s1_phi = -a_n * b_m * h1 * (D_mn * np_exp_2)
F_s2_theta = a_n * b_m * h2 * (D_mn * np_exp_2)
F_s2_phi = 1j * a_n * b_m * h2 * (S_mn * np_exp_2)
j = 2 * (n * (n + 1) + m - 1)
F[2 * npa, j] = F_s1_theta[npa]
F[2 * npa+1 , j] = F_s1_phi[npa]
j = 2 * (n * (n + 1) + m - 1) + 1
F[2 * npa, j] = F_s2_theta[npa]
F[2 * npa+1, j] = F_s2_phi[npa]
</code></pre>
<p>我做了一个简单的测试,执行速度加快了约3秒:</p>
<pre><code>prev_time_ep =time.time()
npp=500
nmax=80
function_call(npp,nmax)
print(" - %s seconds -" % (time.time() - prev_time_ep))
prev_time_ep =time.time()
function_call_2(npp,nmax)
print(" - %s seconds -" % (time.time() - prev_time_ep))
</code></pre>
<p>输出:</p>
<pre><code> - 16.99950885772705 seconds -
- 14.231853580474854 seconds -
</code></pre>