我需要进行一些密集的数值计算,幸运的是 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 个不同。
我怀疑一些内存被分配给所有子进程...... 我希望得到一些关于这里发生的事情以及修复方案的提示。 :)
谢谢
最佳答案
当您使用多处理
时,您正在谈论不同的进程。不同的进程意味着不同的 Python 解释器。不同的解释器意味着不同的随机状态。如果您没有在每个进程上唯一地播种随机数生成器,那么您将从每个进程中获得相同的起始随机状态。
关于Python并行编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26785812/