我需要创建一个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/

10-12 21:36