猿问

使用多处理时避免重新编译 numba 代码

我一直在使用 numba 进行多处理。


唯一的问题 - numba 分别为每个进程重新编译代码。


(当进程数量等于物理 CPU 数量时,这并不是什么大问题,但如果不是这种情况,那就是一个巨大的问题了!)


有没有办法让 numba 编译一次代码,然后跨进程边界共享编译后的工件?


例子 -


from multiprocessing import Process

from time import time, sleep

from numba import njit



@njit

def child():

    pass



if __name__ == "__main__":

    ps = [Process(target=child) for _ in range(100)]

    for p in ps:

        p.start()

    s = time()

    for p in ps:

        p.join()

    print("compile time:", time() - s)

compile time: 19.10037922859192

所有核心的 CPU 使用率均固定为 100%。我已经尝试过numba的cache=True,但不幸的是我的代码无法缓存。


/Users/dev/PycharmProjects/trading/tradingdo/strategy.py:91: NumbaWarning: Cannot cache compiled function "_strategy1" as it uses dynamic globals (such as ctypes pointers and large global arrays)

  @njit


慕工程0101907
浏览 124回答 1
1回答

素胚勾勒不出你

在支持的系统fork()(Linux)上,这很容易 -只需在启动进程之前编译该函数一次 - 这将使 numba 缓存编译器输出,就像通常一样。但由于 fork 的写时复制魔法,该缓存会自动与子进程共享!目前尚不清楚的是如何在没有适当fork()支持的系统上执行此操作。numba 的缓存可以 pickled 吗?from multiprocessing import Processfrom time import time, sleepfrom numba import njit@njitdef child():    passif __name__ == "__main__":    child() # this will do it    ps = [Process(target=child) for _ in range(100)]    for p in ps:        p.start()    s = time()    for p in ps:        p.join()    print("compile time:", time() - s)compile time: 0.011722326278686523numba 的nogil也值得一看。这可以消除对进程的需要,并且线程共享 numba 编译缓存就好了
随时随地看视频慕课网APP

相关分类

Python
我要回答