为什么numpy.random和多处理效果不好?

Mik*_*rns 5 python arrays random numpy multiprocessing

我有一个随机行走功能,numpy.random用于执行随机步骤。该功能walk本身就可以正常工作。同时,它在大多数情况下都可以正常工作,但是与结合使用时multiprocessing,它会失败。为什么multiprocessing会出错?

import numpy as np

def walk(x, n=100, box=.5, delta=.2):
    "perform a random walk"
    w = np.cumsum(x + np.random.uniform(-delta,delta,n))
    w = np.where(abs(w) > box)[0]
    return w[0] if len(w) else n

N = 10

# run N trials, all starting from x=0
pwalk = np.vectorize(walk)
print pwalk(np.zeros(N))

# run again, using list comprehension instead of ufunc
print [walk(0) for i in range(N)]

# run again, using multiprocessing's map
import multiprocessing as mp
p = mp.Pool()
print p.map(walk, [0]*N)
Run Code Online (Sandbox Code Playgroud)

结果通常类似于...

[47 16 72  8 15  4 38 52 12 41]
[7, 45, 25, 13, 16, 19, 12, 30, 23, 4]
[3, 3, 3, 3, 3, 3, 3, 14, 3, 14]
Run Code Online (Sandbox Code Playgroud)

前两种方法显然显示出随机性,而后一种则没有。这是怎么回事,所以multiprocessing做对了吗?

如果您添加一个,sleep那么它是a,sleepwalk并且存在很大的延迟,那么multiprocessing仍然会出错。

但是,如果您使用np.random.uniform像这样的非数组方法替换对的调用[(random.random()-.5) for i in range(n)],则它会按预期工作。

那么,为什么不numpy.randommultiprocessing发挥好?

Ray*_*ger 11

发生了什么,以至于多处理不正确?

您需要在每个进程中重新播种以确保伪随机流彼此独立。

我使用os.urandom生成种子。

  • `np.random.seed(int.from_bytes(os.urandom(4), byteorder='little'))` 在 Python 3 中。 (8认同)