我试图让 numba、多处理器和随机数生成器一起工作。我已将我的真正问题缩小为包含重要元素的以下代码。以下对我有用。
import numpy as np
from numba import jit
import multiprocessing as mp
#@jit(nopython=True)
def compute_with_random(j,rng):
x=rng.normal(0,0.3,j)
y=np.sum(x)/j
return y
#@jit(nopython=True)
def single(args):
(n,se)=args
rng = np.random.default_rng(se)
s=0
for i in range(1,n):
s+=compute_with_random(i,rng)
return s
def Call_Multi():
seed_sequence = np.random.SeedSequence(12345)
seeds = seed_sequence.spawn(4)
all_ins=[ (500,seeds[0]), (700,seeds[1]), (400,seeds[2]), (200,seeds[3]) ]
pool = mp.Pool(4)
result = pool.map( single, all_ins )
return result
if __name__=='__main__':
print( Call_Multi() )
至于我真正的问题,两个函数compute_with_random() 和single() 需要很长时间并且numba 可以加速它们我想使用numba 装饰器,所以使用上面的@jit 装饰器会导致以下错误。
numba.core.errors.TypingError: [1mFailed in nopython mode pipeline (step: nopython frontend)
[1m[1mnon-precise type pyobject[0m
[0m[1mDuring: typing of argument at C:\test\test_rng_numba.py (16) [0m [1m
File "test_rng_numba.py", line 16:[0m
[1mdef single(args):
[1m (n,se)=args
[0m [1m^[0m[0m
This error may have been caused by the following argument(s):
... (truncated)
如果我将 x=rng.normal(0,0.3,j) 替换为 x=np.random.normal(0,0.3,j) 并删除 compute_with_random() 中的参数 rng 和 single() 中的 se ,则该示例也可以正常工作麻木。因此,numba 和并行随机数生成器或种子/rng 可能存在问题。带有 rng.normal() 的随机数生成器应该为每个进程生成独立的随机数链。任何想法如何解决这个问题?谢谢