заставить интегратора выполнить как минимум столько же шагов, сколько в вашем примере, и убедиться, что единственное отличие состоит в том, что результаты интеграции не сохраняются в каком-либо массиве. Это выполняется за 0,010 секунд.

ел бы уменьшить время, затрачиваемое Сипи на решение дифференциального уравнения.

На практике я использовал пример, описанный вPython в научных вычислениях как шаблон. Потому что odeint берет на себя функциюf в качестве аргумента я написал эту функцию как статически типизированную версию Cython и надеялся, что время выполнения odeint значительно уменьшится.

Функцияf содержится в файле с именемode.pyx следующее:

import numpy as np
cimport numpy as np
from libc.math cimport sin, cos

def f(y, t, params):
  cdef double theta = y[0], omega = y[1]
  cdef double Q = params[0], d = params[1], Omega = params[2]
  cdef double derivs[2]
  derivs[0] = omega
  derivs[1] = -omega/Q + np.sin(theta) + d*np.cos(Omega*t)
  return derivs

def fCMath(y, double t, params):
  cdef double theta = y[0], omega = y[1]
  cdef double Q = params[0], d = params[1], Omega = params[2]
  cdef double derivs[2]
  derivs[0] = omega
  derivs[1] = -omega/Q + sin(theta) + d*cos(Omega*t)
  return derivs

Затем я создаю файлsetup.py чтобы выполнить функцию:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize('ode.pyx'))

Скрипт, решающий дифференциальное уравнение (также содержащий версию Pythonf) называетсяsolveODE.py и выглядит как:

import ode
import numpy as np
from scipy.integrate import odeint
import time

def f(y, t, params):
    theta, omega = y
    Q, d, Omega = params
    derivs = [omega,
             -omega/Q + np.sin(theta) + d*np.cos(Omega*t)]
    return derivs

params = np.array([2.0, 1.5, 0.65])
y0 = np.array([0.0, 0.0])
t = np.arange(0., 200., 0.05)

start_time = time.time()
odeint(f, y0, t, args=(params,))
print("The Python Code took: %.6s seconds" % (time.time() - start_time))

start_time = time.time()
odeint(ode.f, y0, t, args=(params,))
print("The Cython Code took: %.6s seconds ---" % (time.time() - start_time))

start_time = time.time()
odeint(ode.fCMath, y0, t, args=(params,))
print("The Cython Code incorpoarting two of DavidW_s suggestions took: %.6s seconds ---" % (time.time() - start_time))

Я тогда бегу:

python setup.py build_ext --inplace
python solveODE.py 

в терминале.

Время для версии Python составляет примерно 0,055 секунды, в то время как версия Cython занимает примерно 0,04 секунды.

Есть ли у кого-нибудь рекомендации по улучшению моей попытки решения дифференциального уравнения, желательно без использования самой процедуры odeint, с Cython?

редактировать

Я включил предложение DavidW в два файлаode.pyx а такжеsolveODE.py Выполнение кода с этими предложениями заняло всего примерно 0,015 секунды.

Ответы на вопрос(3)

Ваш ответ на вопрос