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.random和multiprocessing发挥好?
Ray*_*ger 11
发生了什么,以至于多处理不正确?
您需要在每个进程中重新播种以确保伪随机流彼此独立。
我使用os.urandom生成种子。
| 归档时间: |
|
| 查看次数: |
2918 次 |
| 最近记录: |