我正在使用自动构建的大型ODE系统。我有一个长度为state
的{{1}}数组,并且数组中还存储了相等数量的微分方程。这里有2个,但在实际系统中将有100个以上。微分方程被构造为一个类,并通过n
进行调用,或者,创建ODE并使用__call__
进行调用。我需要将完全相同的functools partial
和时间state
发送到数组中的每个微分函数,并填充导数状态向量t
。我想知道最干净,最pythonic也是最重要的是最快的方法。
dstate
答案 0 :(得分:0)
对于编码,(IMO)对您所做的工作没有重大改进。您可以替换单行循环:
def change(t, state):
return np.array([f(state=state) for f in fs])
关于效率,请检查Calling functions by array index in 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__
快,并且如果您想要一个类,并且除非您对实例有特殊需要,可以使用{{ 1}}装饰器,以避免不必要的实例化