我有一个随机游走函数,它使用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
and multiprocessing
玩得好吗?