首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在numerical python代码中最小化对__new__的调用次数?

有没有办法在numerical python代码中最小化对__new__的调用次数?
EN

Stack Overflow用户
提问于 2016-07-06 03:28:43
回答 0查看 71关注 0票数 1

我正在努力提高一些用python编写的数值建模代码的速度。它依赖于numpy数组和scipy.linalg的矩阵求解方法。这是一个有限差分PDE求解器。在分析和处理一些较慢的比特之后,built-in method __new__占用了最大的时间块。是否每次声明数字时都会执行__new__方法?有什么方法可以避免它吗?以下是求解器的主循环:

代码语言:javascript
复制
    #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__的调用。

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38211214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档