在看似简单的类方法上输入推断错误

时间:2017-12-21 18:45:44

标签: python class methods numba

在以下类方法的运行(numba编译)期间:

@jit(nopython=True)
def isInPosition(self):
    """Returns whether the axis is in the desired position."""
    return True if self.state & 0x04 else False

我收到类型推断错误消息:

无法确定类X.X的Numba类型

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

如果您处于nopython模式,则numba必须支持每个变量的类型。 Python中的非静态方法采用self参数,只要您不使用jitclassself模式就不支持nopython类型这使jit不可能像那样。

但是你可以用unjitted方法和jitted函数重构它:

import numba as nb

@nb.njit
def _is_in_position(state):
    return bool(state & 0x04)

class Fun:
    def __init__(self, state):
        self.state = state

    def is_in_position(self):
        return _is_in_position(self.state)

如果您在对象模式中jit方法,也可以检查它是否更快,也许它可以内联函数调用:

import numba as nb

@nb.njit
def _is_in_position(state):
    return bool(state & 0x04)

class Fun:
    def __init__(self, state):
        self.state = state

    @nb.jit
    def is_in_position(self):
        return _is_in_position(self.state)

根据课程的不同,可以将它作为一个jitclass(但是jitclass要求所有内容都用支持的类型输入,所以很可能你不能这样做):

import numba as nb

spec = [
    ('state', nb.int64),
]

@nb.jitclass(spec)
class Fun(object):
    def __init__(self, state):
        self.state = state

    def is_in_position(self):
        return bool(self.state & 0x04)