我一直在使用 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 回答
![?](http://img1.sycdn.imooc.com/5333a1bc00014e8302000200-100-100.jpg)
素胚勾勒不出你
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 编译缓存就好了
添加回答
举报
0/150
提交
取消