Что касается кодирования, (IMO) нет существенных улучшений в том, что вы сделали.Вы можете заменить однолинейные циклы:
def change(t, state):
return np.array([f(state=state) for f in fs])
Что касается эффективности, отметьте Вызов функций по индексу массива в Python .Лучшее, что вы можете сделать, это объединить функции в одну.В вашем примере:
class F_list:
def __init__(self):
pass
def __call__(self, state):
return 2 - state[0]**2 * state[1], 3 - state[1]*state[0]
def change(self, t, state):
return self(state)
F = F_list()
sol = integrate.solve_ivp(fun = F.change, t_span = (0, 15), y0 = state0)
Также обратите внимание, что использование def
или lambda
всегда быстрее, чем __call__
, и если вам нужен класс и если у вас нет особой потребности в экземплярах, вы можетеиспользуйте декоратор classmethod
, чтобы избежать ненужного создания экземпляра