我正在努力提高一些用python编写的数值建模代码的速度。它依赖于numpy数组和scipy.linalg的矩阵求解方法。这是一个有限差分PDE求解器。在分析和处理一些较慢的比特之后,built-in method __new__占用了最大的时间块。是否每次声明数字时都会执行__new__方法?有什么方法可以避免它吗?以下是求解器的主循环:
#iterate over time steps
for j in range(1,N_t):
#store some numbers
jm1 = j - 1
mm2 = m - 2
mm1 = m - 1
mp1 = m + 1
pm1 = p - 1
pm2 = p - 2
#load the "b vector"
vec[0] = v1*C[0,jm1] + v2*C[1,jm1]
for i in r_vec_a:
vec[i] = hlam_a*C[i-1,jm1] + v3*C[i,jm1] + hlam_a*C[i+1,jm1]
vec[mm1] = -f1*C[mm2,jm1] + f5*C[mm1,jm1] - f3*C[m,jm1] - f4*C[mp1,jm1]
vec[m] = -g1*C[mm2,jm1] - g2*C[mm1,jm1] + g5*C[m,jm1] - g4*C[mp1,jm1]
for i in r_vec_b:
vec[i] = hlam_b*C[i-1,jm1] + v4*C[i,jm1] + hlam_b*C[i+1,jm1]
vec[pm1] = v5*C[pm2,jm1] + v6*C[pm1,jm1]
#solve the matrix equation for new concentrations
C[:,j] = scipy.linalg.solve_banded(u1, banded, vec, check_finite = u2,
overwrite_b = u3)
#compute boundary values (with 2 extra orders of accuracy because it's easy)
C_x0[0,j] = w1*C[0,j] - w2*C[1,j] + w3*C[2,j] - w4*C[3,j]
C_xL[0,j] = e1*C[mm2,j] + e2*C[mm1,j] + e3*C[m,j] + e4*C[mp1,j]
C_yL[0,j] = K_r*C_xL[0,j]
C_y0[0,j] = -w4*C[p-4,j] + w3*C[p-3,j] - w2*C[pm2,j] + w1*C[pm1,j]我的第一个想法是存储所有索引变量和常量,如果它们被重用,但这并没有减少对__new__的调用。
https://stackoverflow.com/questions/38211214
复制相似问题