作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在实现蒙特卡洛方法来求解扩散方程。该解可以表示为 phi(W) 的数学期望值,其中 phi 是一个函数(根据扩散方程而变化),W 是停止在域边界的对称随机游走。要在点 x 处评估函数,我需要从 x 的期望值开始每次行走。
我想在大量点上评估函数。所以这就是我所做的:
我的代码(Python)是这样的:
for k in range(N): #For each "walk"
step = 0
while not(every walk has reach the boundary):
map(update_walk,points) #update the walk starting from each x in points
incr(step)
问题是:它非常长,因为 N 可以很大而且点数也很大。我正在寻找任何可以帮助我优化此代码的解决方案。
我曾想过用 IPython 进行并行处理(每次行走都是独立的),但我没有成功,因为它在函数内部(它返回了一个错误,如
"could not launch function 'f' because it was not found as 'file.f' " but 'f' is define within file.big_f)
最佳答案
这是我可能不会使用并行计算的少数情况之一。我认为只使用 numpy
会更快。
>>> import numpy as np
>>> def walk(x, n=100, box=.5, delta=.2):
... np.random.seed()
... 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
...
>>> pwalk = np.vectorize(walk)
>>> pwalk(np.zeros(10))
array([10, 25, 4, 5, 100, 6, 28, 6, 25, 23])
我想你应该知道如何从那里获得期望值。
您也可以将一个元组传递给 np.random.uniform
的最后一个参数,然后就不需要使用 np.vectorize
。
当然,如果你想使用并行计算,那么你可以选择一个好的map
函数,然后从map
中调用walk
而不是像上面那样使用 vectorize
。
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool(4)
>>> p.map(walk, [0]*10)
[8, 7, 39, 7, 36, 7, 22, 27, 18, 31]
使用 pathos
,因此可以从解释器轻松调用 map 。 https://github.com/uqfoundation/pathos
关于python - 随机游走 - 并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24291319/
我是一名优秀的程序员,十分优秀!