我可以将Python枚举编译成numba JITA类吗?
我试图找到如何将@jitclass与枚举类一起使用。参考手册明确指出它们是,但我无法理解,而且我在任何地方都找不到代码示例 当我试着跑步的时候我可以将Python枚举编译成numba JITA类吗?,python,enums,numba,Python,Enums,Numba,我试图找到如何将@jitclass与枚举类一起使用。参考手册明确指出它们是,但我无法理解,而且我在任何地方都找不到代码示例 当我试着跑步的时候 from numba import jitclass from numba.types import string from enum import Enum type_spec = [ ('A', string), ('B', string) ] @jitclass(type_spec) class Type(Enum):
from numba import jitclass
from numba.types import string
from enum import Enum
type_spec = [
('A', string),
('B', string)
]
@jitclass(type_spec)
class Type(Enum):
A = 'A'
B = 'B'
我得到TypeError:类成员还不受支持:\缺少\名称,值,\转换,\成员\名称,\成员\映射,\成员\类型,\值2成员\映射,A,B
当我尝试在没有规范的情况下编译时,如下所示:
from numba import jitclass
from enum import Enum
@jitclass
class Type(Enum):
A = 'A'
B = 'B'
当我调用构造函数时,我得到一个
AttributeError:items
。我似乎找不到正确的语法来将我的枚举类转换为JIT类。如何实现这一点?我目前面临同样的问题(无法jitclass
Python枚举)。从@user2357112对Monica的支持来看,似乎可以对Numba文档进行重大改进
添加了对枚举的“支持”,但在文档方面严重缺少该请求。我目前面临同样的问题(无法
jitclass
Python枚举)。从@user2357112对Monica的支持来看,似乎可以对Numba文档进行重大改进
添加了对Enum的“支持”,但在文档方面严重缺少该请求。您可以在
njit
函数中使用Enum
,而无需在Enum类上使用jitclass
:
import numba
from enum import Enum, IntEnum
class MyEnum(Enum):
Red = 123
Blue = 456
class IEnum(IntEnum):
one = 1
two = 2
@numba.njit
def check_isblue(e):
assert e == MyEnum.Blue
@numba.njit
def use_cases(a):
"""The following use-cases are supported"""
# comparison
a == MyEnum.Red
a != MyEnum.Red
a is MyEnum.Red
a is not MyEnum.Red
# getitem
a is MyEnum["Red"]
# conditional
MyEnum.Red if True else MyEnum.Blue
# coersion to int
IEnum.one + 1
check_isblue(MyEnum.Blue)
use_cases(MyEnum.Red)
其他用例,例如与IntEnum
值的矢量化比较(也支持通过@vectorize
装饰器)
这是包含在中的测试模块中的“记录”。您可以在
njit
函数中使用Enum
/IntEnum
,而无需在Enum类上使用jitclass
:
import numba
from enum import Enum, IntEnum
class MyEnum(Enum):
Red = 123
Blue = 456
class IEnum(IntEnum):
one = 1
two = 2
@numba.njit
def check_isblue(e):
assert e == MyEnum.Blue
@numba.njit
def use_cases(a):
"""The following use-cases are supported"""
# comparison
a == MyEnum.Red
a != MyEnum.Red
a is MyEnum.Red
a is not MyEnum.Red
# getitem
a is MyEnum["Red"]
# conditional
MyEnum.Red if True else MyEnum.Blue
# coersion to int
IEnum.one + 1
check_isblue(MyEnum.Blue)
use_cases(MyEnum.Red)
其他用例,例如与IntEnum
值的矢量化比较(也支持通过@vectorize
装饰器)
这在包含在中的测试模块中“记录在案”。在您可以在nopython模式下使用枚举的意义上支持它们。我不认为你可以编写它们。你能详细说明一下它们的区别吗?它们是受支持的,因为你可以在nopython模式下使用枚举。我认为你写不出来。你能详细说明一下区别吗?