(Как) scipy.integrate.odeint ускоряет оценку функции?

Обычно чистый Python работает примерно в 50 раз медленнее, чем собственный код (C, Fortran), если он состоят из плотного цикла с простой арифметикой. Когда вы используете scipy.odeint, как описано для Например, в этом руководстве вы просто пишете функции, которые интегрируются в чистый 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.weave не используются.

Я задаю этот вопрос, потому что, возможно, было бы неплохо использовать тот же подход, что и scipy.integrate.odeint, для ускорения узких циклов в моем собственном коде. Использование odeint даже удобнее, чем использование f2py или scipy.weave.


person Prokop Hapala    schedule 24.03.2014    source источник


Ответы (1)


Нет, код odeint вызывает вашу функцию python без какой-либо оптимизации.

Он заключает вашу функцию в ode_function (см. здесь), который, в свою очередь, вызывает вашу функцию Python с помощью call_python_function. Затем c функция ode_function будет использоваться модулем odepack.

Если вам интересен интегратор ODE/PDE, поддерживающий преобразование/ускорение кода из python в C, посмотрите pydelay (ссылка). который использует на самом деле weave.

person gg349    schedule 24.03.2014