减少 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 只是为了保存数据,并用 @njit
和 cache
:
编译所有方法
@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, #3。 jitclass
目前无法在解释器重新启动时安全地缓存,这是一个非常深层次的问题。引用一位开发人员的话:
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 是 实验性 功能。
我正在使用 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 只是为了保存数据,并用 @njit
和 cache
:
@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, #3。 jitclass
目前无法在解释器重新启动时安全地缓存,这是一个非常深层次的问题。引用一位开发人员的话:
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 是 实验性 功能。