gpt4 book ai didi

python - 编写与 `scipy.integrate.odeint` 交互的 Python 类的启发式设计?

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:41 25 4
gpt4 key购买 nike

简介

scipy.integrate.odeint需要一个函数作为它的第一个参数,该函数计算我们要对其积分的变量的导数(从现在开始,我将其称为 d_func,表示“导数函数”)。

d_func 必须由用户用 Python 代码编写。使用 Numba 提高性能的一个好方法是 @jit d_func(因为 d_func 被称为 many 集成期间的次数)。

d_func 足够复杂以至于它需要一个 Python 类对象时,我对如何编写高性能代码有疑问。

代码设置

这是我的代码的“卡通”:

  • 有一个模块叫做 DynamicBox.py
  • 这个模块里面是一个 Python 类,DynamicBox
  • DynamicBox 有一堆属性
  • 其中一些属性是“相变量”——也就是说,它们是我有兴趣积分的数量
  • 其中一些属性是“参数”——也就是说,我用它们来计算相位变量的导数

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

  • 我会有一个d_func
  • d_func 本身会调用很多小辅助函数来使用 DynamixBox 计算导数中的相关项属性

设计选择

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

  1. 要么我可以制作 d_func 及其所有辅助函数方法动态框
  2. 或者我可以只让d_func成为DynamicBox的一个方法, 并且它的所有辅助函数都在同一个模块中 DynamicBox,但不是DynamicBox的方法;
  3. 或者只有辅助函数是DynamicBox的方法,但是d_func 只是在同一个模块 (DynamicBox.py) 中,而不是一个DynamicBox的方法;
  4. 或者辅助函数和 d_func 都不是动态框。

问题

我对 Python 的了解还不够,无法确定哪种选择是最好的。我认为需要回答以下问题。

  • 进行实例属性调用以获取属性是昂贵的还是仅当您在不是方法的函数中时才昂贵类(class)的?

  • 如果使用 Numba 怎么办?例如,如果我使用 @jit-ting 普通函数而不是类方法,Numba 会更喜欢它吗?

最佳答案

我可以评论这个问题的 Numba 部分。

正如其他用户所提到的,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 层进行属性访问。

做同样事情的更好方法是:

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

def dosomething(self, y):
_dosomething(self.x, y)

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

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

关于python - 编写与 `scipy.integrate.odeint` 交互的 Python 类的启发式设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com