我想运行许多随机沉积模拟以分析统计数据。
各个模拟并不相互依赖,但每个模拟产生一维numpy数组,我希望我的结果是由这些一维数组组成的二维数组。
我基本上对并行计算一无所知,所以我只有两个想法如何实现这个目标:
但是,我认为必须有更好的方法来做到这一点。我目前的代码如下:
L = 60
N = 100
T = 100
hrubost_relax = np.zeros((N,T))
for n in range(0,N):
level = np.zeros((T,L))
heights = np.zeros(level.shape[1])
for t in range(1,level.shape[0]):
pos = np.random.randint(level.shape[1])
left = heights[pos-1] if pos-1>0 else heights[-1]
right = heights[pos+1] if pos+1<L else heights[0]
if left<heights[pos]:
if right<heights[pos]:
direction = np.random.randint(2)*2-1
heights[(pos+direction)%L] += 1
else:
heights[pos-1] += 1
elif right<heights[pos]:
heights[(pos+1)%L] += 1
else:
heights[pos] += 1
hrubost_relax[n,t] = heights.std()/L
我想并行化外部for-loop
编辑以使用multiprocessing.Pool显示我的解决方案
from multiprocessing import Pool
L = 60
N = 1000
T = 100000
hrubost_relax = np.zeros((N,T))
def deposition(n):
level = np.zeros((T,L))
heights = np.zeros(level.shape[1])
w = np.zeros(T)
for t in range(1,level.shape[0]):
pos = np.random.randint(level.shape[1])
left = heights[pos-1] if pos-1>0 else heights[-1]
right = heights[pos+1] if pos+1<L else heights[0]
if left<heights[pos]:
if right<heights[pos]:
direction = np.random.randint(2)*2-1
heights[(pos+direction)%L] += 1
else:
heights[pos-1] += 1
elif right<heights[pos]:
heights[(pos+1)%L] += 1
else:
heights[pos] += 1
w[t] = heights.std()/L
return w
p = multiprocessing.Pool(4)
for i,x in enumerate(p.map(deposition, range(N))):
hrubost_relax[i] = x
答案 0 :(得分:2)
如果您使用CPython实现,由于使用了全局解释器锁,线程无法为此问题提供任何加速,只允许单个线程在任何时间执行(我假设计算是CPU-界)。但是,如果您的计算机中有多个处理器,multiprocessing
module
将允许您并行运行多个进程。但是,尝试运行比处理器更多的进程仍然没有实际价值,因此您应该考虑使用multiprocessing.Pool