使用多重处理通过 numpy 生成随机数

问题描述 投票:0回答:1

我想使用多重处理在 Numpy 中生成随机数。使用这个这个答案我在这条消息的末尾写了代码,它似乎有效。因为我链接到的答案很旧,所以我想确保它仍然正确。 Numpy 的官方文档似乎说

np.random.seed
已被弃用,但我似乎找不到关于它推荐的 Generator 实例的好的文档,而且看起来更复杂。

import numpy as np
from multiprocessing import Pool

def generate_random(iproc):
    # if then next line is commented then each process produces same random numbers
    np.random.seed()
    nums = np.random.uniform(size=8)
    print(f'{iproc=},{nums=}')
    

if __name__ == '__main__':
    nproc = 8
    arglist = []
    for iproc in range(nproc):
        arglist.append((iproc,))
        
    with Pool(nproc) as p:
        p.starmap(generate_random, arglist)
numpy random multiprocessing
1个回答
0
投票

为了避免共享全局随机状态对象,您可以使用不同的种子为子进程播种。以下是如何使用 Numpy 的生成器 API 实现此目的的最小示例:

import numpy as np
from multiprocessing import Pool


def generate_random(idx_proc, seed):
    random_state = np.random.RandomState(seed)
    nums = random_state.uniform(size=8)
    print(f"{idx_proc=}, {nums=}")


if __name__ == "__main__":
    n_proc = 8

    random_state = np.random.RandomState(480273)

    seeds = random_state.randint(0, 2**32-1, n_proc)

    with Pool(n_proc) as p:
        p.starmap(generate_random, enumerate(seeds))

通过在主进程中使用随机状态对象并从中生成种子,您将获得可重现的结果(但请记住,进程运行的顺序和计算数字可能无法重现!)。

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.