我需要做一些激烈的数值计算,幸运的是python提供了非常简单的方法来实现并行化。然而,我得到的结果是完全奇怪的,经过一些试验的错误,我偶然发现了问题。
以下代码只是计算随机数字样本的平均值,但说明了我的问题:
import multiprocessing
import numpy as np
from numpy.random import random
# Define function to generate random number
def get_random(seed):
dummy = random(1000) * seed
return np.mean(dummy)
# Input data
input_data = [100,100,100,100]
pool = multiprocessing.Pool(processes=4)
result = pool.map(get_random, input_data)
print result
for i in input_data:
print get_random(i)
现在输出如下:
[51.003368466729405, 51.003368466729405, 51.003368466729405, 51.003368466729405]
用于并行化,它始终是相同的
和正常的非并行循环一样:
50.8581749381
49.2887091049
50.83585841
49.3067281055
正如您所看到的,并行化只返回相同的结果,即使它应该具有计算差异意味着就像循环一样。现在,有时我只得到3个相同的数字,其中一个与另外3个不同。
我怀疑某些内存被分配给所有子进程...... 我会喜欢这里发生的事情的一些提示以及修复的样子。 :)
感谢
答案 0 :(得分:2)
当您使用multiprocessing
时,您正在谈论不同的流程。不同的流程意味着不同的Python解释器。不同的解释器意味着不同的随机状态。如果您没有在每个进程上唯一地播种随机数生成器,那么您将从每个进程获得相同的起始随机状态。
答案 1 :(得分:0)
答案是在每个过程中添加一个新的随机种子。将功能更改为
def get_random(seed):
np.random.seed()
dummy = random(1000) * seed
return np.mean(dummy)
给出想要的结果。