【问题标题】:( How ) does scipy.integrate.odeint accelerate function evaluation?(如何) scipy.integrate.odeint 加速函数评估?
【发布时间】:2014-05-01 17:45:45
【问题描述】:

如果它由带有简单算法的紧密循环组成,则通常是纯 python is ~50x slower than native code (C, Fortran)。当您使用 scipy.odeint 时,例如在此 tutorial 中描述的那样,您只需编写函数就可以像这样集成到纯 python 中:

def f(y, t):
       Si = y[0]
       Zi = y[1]
       Ri = y[2]
       # the model equations (see Munz et al. 2009)
       f0 = P - B*Si*Zi - d*Si
       f1 = B*Si*Zi + G*Ri - A*Si*Zi
       f2 = d*Si + A*Si*Zi - G*Ri
       return [f0, f1, f2]

这个函数必须被多次评估,所以我认为它会成为一个巨大的性能瓶颈,考虑到 odeint 积分器本身是在 FORTRAN/ODPACK 中制作的

它是否使用某些东西将函数 f(y,t) 从 python 转换为原生代码? (像 f2py、scipy.weave、cython ...)据我所知,odeint 不需要任何 C/C++ 或 Fortran 编译器,也不会增加我的 python 脚本的初始化时间,所以可能是 f2py 和 scipy。未使用编织。

我问这个问题,因为,也许,在我自己的代码中使用与 scipy.integrate.odeint 相同的方法来加速紧密循环是个好主意。使用 odeint 比使用 f2py 或 scipy.weave 更方便。

【问题讨论】:

    标签: python performance scipy ode


    【解决方案1】:

    不,它没有,odeint 代码调用你的 python 函数没有任何优化。

    它将您的函数包装在ode_function(参见here)中,然后用call_python_function 调用您的python 函数。然后c函数ode_function将被odepack模块使用。

    如果热衷于支持 pythonC 代码转换/加速的 ODE/PDE 集成器,请查看 pydelay (link)。实际上使用的是weave

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 2010-11-24
      • 2019-08-28
      相关资源
      最近更新 更多