带Scipy的数字:函数调用和编译

问题描述 投票:0回答:1

我是Scipy的数字新手。特别是,我想集成一个(复杂的)微分方程组。我注意到scipy.integrate.solve_ivp可以胜任。由于我的方程式取决于某些数值参数,因此我编写了一个builder类以构建方程式以及初始条件

from scipy.integrate import solve_ivp

class eq_builder:
    def __init__(self, parameters):
        self._parameters = parameters

    def build_eqs():
        def numerical_function(t, y):
            #here y is a list. This numerical function uses parameters and return a list
        return numerical_function

    def build_ics():
        #generate and returns initial conditions (as a list)

然后我用

a = eq_builder(my_parameter)
solve_ivp(a.build_eqs(), [0, 10000], a.build_ics())

问题

  1. 由于numerical_function将多次调用solve_ivp,有没有一种方法[可以使计算过程更快?
  2. [在numerical_function的定义中,我应该尽可能限制一些更抽象(但令人印象深刻)的东西,例如列表或列表理解中的map
  3. 您还有其他建议可以给我吗?考虑到上述系统中的方程数约为几百个。
python scipy numeric numerical-integration
1个回答
1
投票
由于数字函数将由solve_ivp多次调用,因此有一种方法可以编译它以使计算过程更快?

您必须竭尽所能。退后一步,您的假设似乎是“编译”代码总是比Python快。事实并非如此。的确,在Python中像循环之类的简单事情要比在C语言中慢,但这就是您不使用Python编写大型循环的原因。您宁愿使用numpy数组及其内在函数。例如,numpy.dot(a, b)比用C语言编写的任何内容都要快[[多,因为numpy.dot使用了一些精美的库(在这种情况下,BLAS)比以前做得更好。

在numerical_function的定义中,我应该限制一些抽象的(但令人印象深刻的东西),例如映射到列表或列表理解吗?

这是一个品味问题。

您还有其他建议可以给我吗?考虑到上述系统中的方程数约为几百个。

[即使它运行缓慢,也要使其开始运行,然后尝试找出

where您的代码运行缓慢,然后尝试在那里进行改进。

© www.soinside.com 2019 - 2024. All rights reserved.