gpt4 book ai didi

numba - 在 Numba 优化的 Python 中将类对象作为函数参数传递

转载 作者:行者123 更新时间:2023-12-02 08:08:38 26 4
gpt4 key购买 nike

我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。

spec = [("a", float64),("b",float64)]
@jitclass(spec)
class SOMETHING_3():
def __init__(self):
self.a = 1.1
self.b = 2.3

def sum(self):
return self.a + self.b


@jit(float64(float64, XXX), nopython = True)
def get_sum_3(c, someobj):
d = 0
for i in range(1000):
for j in range(1000):
d += c + someobj.sum()
return d

如果我删除显式类型分配“float64(float64, XXX)”,它可以正常工作。

但是有什么我可以替换 XXX 来告诉它是我正在传递的类对象。

最佳答案

如果您将 XXX 替换为 SOMETHING_3.class_type.instance_type,您提供的代码应该可以工作。

值得注意的是,如果您改为尝试接收一组 jitclass 对象,这将变得更加棘手(我相信目前不可能)。如果您的完整问题/代码涉及这些 jitclass 对象的数组,我建议您考虑使用 NumPy 结构化数组而不是 jitclass 来实现。这主要是因为当前版本的 Numba 似乎不支持使用 jitclass 对象数组作为函数参数。原因是 jitclass 对象数组将被解释为数据类型为 numpy.object 的 NumPy 数组,这在 Numba 的 nopython 模式中不受支持。由于它是 Numba 无法降低的类型(编译以在 nopython 模式下使用),因此 nopython 模式对于延迟编译(无函数签名)和急切编译(指定函数签名)都会失败。

更新:

现在支持 jitclass 对象列表,但是在 Python 和 nopython 编译代码之间传递它们会产生非常大的开销(在编写本文时),所以请记住这一点。

关于numba - 在 Numba 优化的 Python 中将类对象作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49098254/

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