为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕工程0101907 2023-08-03 17:19:25
我一直在使用 numba 进行多处理。唯一的问题 - numba 分别为每个进程重新编译代码。(当进程数量等于物理 CPU 数量时,这并不是什么大问题,但如果不是这种情况,那就是一个巨大的问题了!)有没有办法让 numba 编译一次代码,然后跨进程边界共享编译后的工件?例子 -from multiprocessing import Processfrom time import time, sleepfrom numba import njit@njitdef child():    passif __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
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

在支持的系统fork()(Linux)上,这很容易 -


只需在启动进程之前编译该函数一次 - 这将使 numba 缓存编译器输出,就像通常一样。


但由于 fork 的写时复制魔法,该缓存会自动与子进程共享!


目前尚不清楚的是如何在没有适当fork()支持的系统上执行此操作。numba 的缓存可以 pickled 吗?


from multiprocessing import Process

from time import time, sleep

from numba import njit



@njit

def child():

    pass



if __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.011722326278686523

numba 的nogil也值得一看。这可以消除对进程的需要,并且线程共享 numba 编译缓存就好了


查看完整回答
反对 回复 2023-08-03
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信