我有一个随机漫游功能,它使用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.random
和multiprocessing
不是很好玩?