慕工程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 編譯緩存就好了
添加回答
舉報
0/150
提交
取消