为编写与`scipy.integrate.odeint`?

2024-10-03 17:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

简介

^{}需要一个函数作为它的第一个参数,该函数计算我们要积分的变量的导数(从现在起,我将其称为d_func,表示“导数函数”)。在

d_func必须由用户用Python代码编写。使用Numba提高性能的一个很好的方法是@jitd_func(因为d_func在集成过程中被多次调用)。在

d_func复杂到需要一个Python类对象时,如何编写性能代码。在

代码设置

以下是我代码的“卡通”:

  • 有一个名为DynamicBox.py的模块
  • 这个模块中有一个Python类,DynamicBox
  • DynamicBox有许多属性
  • 其中一些属性是“相位变量”,也就是说,它们是我感兴趣的积分量
  • 其中一些属性是“参数”--也就是说,我使用它们来 计算相位变量的导数

我将有一组函数,它们将采用DynamixBox相位变量或参数属性,以便计算导数中的相关项。即:

  • 我要一份d_func
  • d_func本身会调用许多小的helper函数来 使用DynamixBox计算导数中的相关项 属性

设计选择

我必须做出选择,有以下几种选择:

  1. 或者我可以使d_func及其所有助手函数的方法 DynamicBox
  2. 或者我只能使d_func成为DynamicBox的方法, 它的所有helper函数都在同一个模块中 ^{cd9>方法的{
  3. 或者只有helper函数是DynamicBox的方法,但是 d_func只是在同一个模块(DynamicBox.py)中,而不是 DynamicBox方法
  4. 或者helper函数和d_func都不是 动力箱。在

问题

我对Python的了解还不足以确定哪种选择是最好的。以下问题我想需要回答。在

  • 调用实例属性来获取属性是否昂贵,或者仅当您使用的是非方法的函数时,成本是否高昂 班上的?

  • 如果麻巴在比赛呢?例如,如果我使用普通函数而不是类方法,Numba会更喜欢它吗?


Tags: 模块方法函数代码用户pyhelper参数
1条回答
网友
1楼 · 发布于 2024-10-03 17:20:28

我可以对这个问题的麻木部分发表评论。在

正如其他用户所提到的,Numba中的属性访问会导致一些开销。例如,您可能会想写这样的代码:

class Foo(object):
    def __init__(self, x):
        self.x = x

    @numba.jit
    def dosomething(self, y):
        for i in range(len(self.x)):
            self.x[i] += y[i]

这将很慢,因为Numba每次遇到self.x时都必须调用Python层进行属性访问。在

更好的方法是:

^{pr2}$

这里循环中没有属性访问,另外,我们可以添加nopython=True参数,如果函数必须返回到任何(慢的)Python代码,这将导致Numba引发错误。这个nopython参数是确保Numba函数尽可能高效的一个好方法。在

相关问题 更多 >