我需要创建一个set
作为jitclass
属性,并且它必须开始为空:
import numba as nb
@nb.jitclass([('foo', nb.types.Set(nb.f8))])
class Bar:
def __init__(self):
self.foo = set()
b = Bar()
但这失败了,因为numba不知道临时
set
变量所包含的对象的类型:Failed in nopython mode pipeline (step: nopython frontend)
Cannot infer the type of variable '$0.2' (temporary variable),
have imprecise type: set(undefined).
这可以工作:
import numba as nb
@nb.jitclass([('foo', nb.types.Set(nb.f8))])
class Bar:
def __init__(self):
self.foo = {0.}
self.foo.clear()
b = Bar()
但是解决方案确实很难看。有没有更好的方法来初始化空的
set
?我正在使用Python 3.6和Numba 0.45.1
最佳答案
您不能在__init__
es的jitclass
中实例化空的“ Python类”。列表也会出现相同的问题(从numba 0.45.1起):
@nb.jitclass([('foo', nb.types.List(nb.f8))])
class Bar:
def __init__(self):
self.foo = []
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Failed in nopython mode pipeline (step: nopython frontend)
Cannot infer the type of variable '$0.1' (temporary variable), have imprecise type: list(undefined).
这里的问题是,numba通过仅分析函数体来推断类型。它没有考虑到类的规范。
我个人将创建一个函数包装器来创建空集,这样,如果(或何时)numba决定基于签名/规范实现创建空集,更改代码就变得更加容易:
import numba as nb
@nb.njit
def create_empty_set_float64():
aset = {1.}
aset.clear()
return aset
@nb.jitclass([('foo', nb.types.Set(nb.f8))])
class Bar:
def __init__(self):
self.foo = create_empty_set_float64()
b = Bar()
关于python - 在jitclass属性中设置为空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57886811/