当前位置: 首页 > 面试题库 >

Python Multiprocessing Numpy Random

汝岳
2023-03-14
问题内容

在多处理调用的函数中,numpy ndarray的作用范围是否有所不同?这是一个例子:

使用python的多处理模块,我正在像这样调用一个函数:

for core in range(cores):
    #target could be f() or g()
    proc = mp.Process(target=f, args=(core))
    jobs.append(proc)
for job in jobs:
    job.start()
for job in jobs:
    job.join()

def f(core):
    x = 0
    x += random.randint(0,10)
    print x

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    shuffled = np.random.permutation(local)

调用f(core),该x变量在进程本地,即。它会按预期打印一个不同的随机整数。这些永远不会超过10,表明x=0在每个过程中。那是对的吗?

调用g(core)并置换数组的副本将返回4个相同的“改组”数组。这似乎表明工作副本不是本地子进程。那是对的吗?如果是这样,那么除了需要使用共享内存空间之外,当需要从共享内存空间填充子进程时,是否可以使ndarray在子进程本地?

编辑:

更改g(core)以添加一个随机整数似乎具有所需的效果。数组显示不同的值。必须发生某种事情,permutation即对列(每个子进程本地)进行随机排序具有相同的…想法?

def g(core):
    #Assume an array with 4 columns and n rows
    local = np.copy(globalshared_array[:,core])
    local += random.randint(0,10)

编辑II: np.random.shuffle也表现出相同的行为。数组的内容在改组,但在每个内核上改组为相同的值。


问题答案:

调用g(core)并置换数组的副本将返回4个相同的“改组”数组。这似乎表明工作副本不在子进程本地。

这可能表明随机数生成器在每个子进程中均被初始化,从而产生相同的序列。您需要为每个孩子的生成器添加种子(也许将孩子的进程ID放入混合中)。



 类似资料:

相关阅读

相关文章

相关问答