我有一个返回随机 numpy 数组的函数
def rand_weights(assets,lst,l,m):
#
df_ranges=pd.DataFrame(lst,index=assets,columns=['range low','range high']).transpose()
#
arr_ranges_low=df_ranges[assets].values[0]
arr_ranges_high=df_ranges[assets].values[1]
#
rands=np.zeros(l)
weights=np.zeros((m,l))
for k in range(m):
while rands.sum()!=1000:
rands=np.array([np.random.randint(
arr_ranges_low[i],arr_ranges_high[i]
) for i in range(l)])
if rands.sum()==100:
weights[k]=rands
break
##
return weights
例如:
##
l=8
m=5
lst=[[0,25],[0,10],[0,25],[0,20],
[0,12],[0,10],[0,10],[0,15],[0,4],[0,4],[0,4]]
rand_weights(assets,lst,l,m)
#
array([[23., 9., 19., 19., 7., 7., 4., 12.],
[22., 0., 22., 19., 6., 9., 9., 13.],
[20., 5., 23., 17., 8., 7., 9., 11.],
[23., 8., 24., 15., 10., 2., 8., 10.],
[21., 9., 22., 18., 7., 3., 6., 14.]])
我正在使用 pool.starmap()
在多个进程上调用 rand_weights
n_iter 次(此处用于测试:1000)
def MP_a_func(func,iterable,proc,chunk):
#
pool=multiprocessing.Pool(processes=proc)
Result=pool.starmap_async(func,iterable,chunksize=chunk)
pool.close()
#
return Result
同时使用 rand_weights
和 MP_a_func
时:
n_iter=1000
iterable=[[assets,lst,l,m] for n in range(n_iter)]
if __name__ == '__main__':
de_weights=MP_a_func(rand_weights,iterable,proc,chunk)
weights=de_weights.get()
当 proc=2
或 proc=3
时,每个进程都会得到相同的结果,例如:
>>> weights[0]
array([[ 0., 9., 5., 7., 8., 6., 12., 0., 0., 2., 51.],
[10., 0., 6., 6., 9., 2., 5., 3., 0., 3., 56.],
[ 0., 17., 2., 5., 9., 8., 2., 3., 1., 11., 42.],
[ 5., 6., 3., 11., 5., 9., 10., 1., 0., 10., 40.],
[ 3., 8., 17., 10., 6., 2., 2., 0., 0., 7., 45.]])
##
>>>weights[2]
#
array([[ 0., 9., 5., 7., 8., 6., 12., 0., 0., 2., 51.],
[10., 0., 6., 6., 9., 2., 5., 3., 0., 3., 56.],
[ 0., 17., 2., 5., 9., 8., 2., 3., 1., 11., 42.],
[ 5., 6., 3., 11., 5., 9., 10., 1., 0., 10., 40.],
[ 3., 8., 17., 10., 6., 2., 2., 0., 0., 7., 45.]])
所以结果如 weights[2]=weights[0]; weights[1]=weights[3] ....
我该如何解决这个问题?
问候,