减少 numba @jitclass 编译时间(使用缓存?)

Reducing numba @jitclass compilation time (with caching?)

我正在使用 numba@jitclass,我想减少编译时间。

例如(我的实际class要大得多):

@jitclass
class State:
    a: int
    b: int

    def __init__(self):
        a = 0
        b = 0

    def update(self, x: int):
        self.a += x
        self.b -= x

我尝试将 cache 参数添加到 @jitclass,但似乎不受支持。

@jitclass(cache=True)
class State:
    ...

我也试图改变我的 class 只是为了保存数据,并用 @njitcache:

编译所有方法
@jitclass
class State:
    a: int
    b: int

    def __init__(self):
        a = 0
        b = 0

@njit(cache=True)
def update(state: State, x: int):
    state.a += x
    state.b -= x

但这似乎使编译时间变得更糟。我的猜测是因为 State 没有缓存它每次编译,然后依赖函数需要编译。

有什么解决方案可以减少这个编译时间吗?

这是一个已知未解决的问题,看起来这不会很快得到解决(因为这个问题至少在 6 年前就已经被报告过)。您可以在以下问题中获得有关此的信息:#1, #2, #3jitclass 目前无法在解释器重新启动时安全地缓存,这是一个非常深层次的问题。引用一位开发人员的话:

Note that if this pickling did work, then the cached bytecode would be invalid across interpreter restarts, as it contains a hard-coded memory address of where the type used to live.

使用 structrefs 似乎是一种解决方法(虽然不是很好)。重构代码以便尽可能不使用 jitclass 是一个更好的选择。请注意,到目前为止,jitclass 和 structuref 是 实验性 功能。