将 class 对象作为函数参数传递,在 Numba 中优化 Python
Passing a class object as a function argument, in Numba optimized Python
我想将 class 对象传递给函数。
我可以让它工作,但我想知道是否有一种类型可以分配给它?
我有一个 "minimal" 例子来说明我正在尝试做什么。
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 来表明它是我传递的 class 对象。
如果您将 XXX
替换为 SOMETHING_3.class_type.instance_type
,您提供的代码应该可以使用。
值得注意的是,如果您改为尝试接收一组 jitclass 对象,这将变得更加棘手(我相信目前不可能)。如果您的完整 problem/code 涉及这些 jitclass 对象的数组,我建议您考虑使用 NumPy 结构化数组而不是 jitclass。这主要是因为当前版本的 Numba 似乎不支持使用 jitclass 对象数组作为函数参数。这样做的原因是 jitclass 对象数组将被解释为 dtype 为 numpy.object
的 NumPy 数组,这在 Numba 的 nopython 模式中不受支持。由于它是 Numba 无法降低的类型(编译以在 nopython 模式下使用),因此 nopython 模式对于延迟编译(无函数签名)和急切编译(指定函数签名)都会失败。
更新:
现在支持 jitclass 对象列表,但是在 Python 和 nopython 编译代码之间传递它们的开销非常大(在编写本文时),所以请记住这一点。
我想将 class 对象传递给函数。 我可以让它工作,但我想知道是否有一种类型可以分配给它? 我有一个 "minimal" 例子来说明我正在尝试做什么。
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 来表明它是我传递的 class 对象。
如果您将 XXX
替换为 SOMETHING_3.class_type.instance_type
,您提供的代码应该可以使用。
值得注意的是,如果您改为尝试接收一组 jitclass 对象,这将变得更加棘手(我相信目前不可能)。如果您的完整 problem/code 涉及这些 jitclass 对象的数组,我建议您考虑使用 NumPy 结构化数组而不是 jitclass。这主要是因为当前版本的 Numba 似乎不支持使用 jitclass 对象数组作为函数参数。这样做的原因是 jitclass 对象数组将被解释为 dtype 为 numpy.object
的 NumPy 数组,这在 Numba 的 nopython 模式中不受支持。由于它是 Numba 无法降低的类型(编译以在 nopython 模式下使用),因此 nopython 模式对于延迟编译(无函数签名)和急切编译(指定函数签名)都会失败。
更新:
现在支持 jitclass 对象列表,但是在 Python 和 nopython 编译代码之间传递它们的开销非常大(在编写本文时),所以请记住这一点。