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

时间:2014-06-21 20:32:30

标签: python arrays numpy random 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)

结果通常类似......

[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]

前两种方法显然表现出随机性,而后者则没有。 发生了什么事,以致multiprocessing没有做到这一点?

如果您添加sleep以使其成为sleepwalk且存在重大延迟,multiprocessing仍会出错。

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

那么为什么numpy.randommultiprocessing不是很好玩?

1 个答案:

答案 0 :(得分:3)

  

发生了什么,以便多处理无法正确处理?

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

我使用os.urandom生成种子。