Python并行编程问题

标签 python parallel-processing

我需要进行一些密集的数值计算,幸运的是 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/

相关文章:

python - Windows PC 上的 IPython 并行计算?

python - 如何从结尾字符可以更改的文件夹中导入文件 - python pandas?

python - 在 seaborn 中绘制多个箱线图

java - 在线程之间共享资源,不同 java 版本中的不同行为

R - 提高插入符::训练函数的性能

scala - 使用关联和交换运算符折叠/减少 future 列表

python - 在 Django 3 ASGI 模式和 WSGI 模式下处理请求有什么区别?

python - socket.timeout mongoDB pyspark

python - 每个线程一个 aiohttp ClientSession?

java - 如何使用 Java 中的 Spliterator 测试并行处理的性能