(如何)scipy.integrate.odeint加速功能评估?

时间:2014-03-24 11:33:49

标签: python performance scipy ode

通常纯粹的python is ~50x slower than native code(C,Fortran),如果它由简单的aritmetics紧密循环组成。当您在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更方便。

1 个答案:

答案 0 :(得分:4)

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

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

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