Обычно чистый 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.