gpt4 book ai didi

python - `@numba.jitclass` ed 特殊方法去哪里了?

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:27 27 4
gpt4 key购买 nike

TL;DR:用 @numba.jitclass 装饰类时特殊方法如 __add__不会出现在类的实例中,而其他方法则正常工作。为什么会出现这种情况?

考虑以下类声明:

import numba as nb            

dual_spec = [('x', nb.float64), ('y', nb.float64)]

@nb.jitclass(dual_spec)
class xy:
def __init__(self, x, y):
self.x = x
self.y = y

def addition(self, other):
return xy(self.x + other.x, self.y + other.y)

def __add__(self, other):
return xy(self.x + other.x, self.y + other.y)

如果没有装饰器,该类就可以正常工作。由于__add__方法表达式如 xy(1, 2) + xy(3, 4)是可能的并返回预期结果。但是,使用装饰器时,我收到以下错误消息:

>>> xy(1, 2) + xy(3, 4)  # TypeError: unsupported operand type(s) for +: 'xy' and 'xy'
>>> xy(1, 2).addition(xy(3, 4)) # But this works nicely

看起来像__add__ xy 中不存在该方法对象:

>>> xy(1, 2).__add__  # AttributeError: 'xy' object has no attribute '__add__'

但是该方法存在于类中:

>>> xy.__add__  # <function __main__.xy.__add__>

numba 对 __add__ 做了什么?实例化期间的方法?有没有另一种方法可以为 jitted 类启用运算符,以便我可以编写 xy(1, 2) + xy(3, 4)

最佳答案

目前(从 numba 版本 0.33 开始)不支持 jitclass 上的运算符重载,请在此处打开问题: https://github.com/numba/numba/issues/1606#issuecomment-284552746

我不知道确切的内部结构,但很可能该方法只是被丢弃了。请注意,当您在 jitclass 实例化时,您并不是直接实例化 python 类,而是获得低级 numba 类型的包装器。

v = xy(1, 2)

v
Out[8]: <numba.jitclass.boxing.xy at 0x2e700274950>

v._numba_type_
Out[9]: instance.jitclass.xy#2e77d394438<x:float64,y:float64>

关于python - `@numba.jitclass` ed 特殊方法去哪里了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44242631/

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