两个for循环的多处理

问题描述

我正在努力用python(2.7)实现算法来并行化物理问题的计算。在两个变量(比如说a和b)上有一个参数空间,我要在该参数空间上运行编写的程序f(a,b),该程序返回另外两个变量c和d。

到目前为止,我在a和b上使用两个for循环来计算c和d的两个数组,然后将它们保存为txt文档。由于参数空间相对较大并且每次计算点f(a,b)都需要相对较长的时间,因此最好将我的8个CPU内核全部用于参数空间扫描。

我已经阅读了有关多线程和多处理的内容,看来多处理正是我要寻找的。您是否知道此应用程序的良好代码示例或资源,以了解我相当简单的应用程序的多处理基础知识?

解决方法

这里是一个示例,说明如何使用带有简单函数的多重处理,该函数带有两个参数并返回两个数字的元组,以及要在其上进行计算的参数空间:

from itertools import product
from multiprocessing import Pool
import numpy as np

def f(a,b):
    c = a + b
    d = a * b
    return (c,d)

a_vals = [1,2,3,4,5,6]
b_vals = [10,11,12,13,14,15,16,17]

na = len(a_vals)
nb = len(b_vals)

p = Pool(8)  # <== maximum number of simultaneous worker processes

answers = np.array(p.starmap(f,product(a_vals,b_vals))).reshape(na,nb,2)

c_vals = answers[:,:,0]
d_vals = answers[:,1]

这给出了以下内容:

>>> c_vals
array([[11,17,18],[12,18,19],[13,19,20],[14,20,21],[15,21,22],[16,22,23]])

>>> d_vals
array([[ 10,17],[ 20,24,26,28,30,32,34],[ 30,33,36,39,42,45,48,51],[ 40,44,52,56,60,64,68],[ 50,55,65,70,75,80,85],[ 60,66,72,78,84,90,96,102]])

p.starmap返回一个2元组的列表,然后从中提取c和d值。

这假定您将在获取所有结果之后在主程序中执行文件I / O。


附录

如果p.starmap不可用(Python 2),那么您可以更改函数以采用单个输入(2元素元组):

def f(inputs):
    a,b = inputs
    # ... etc as before ...

,然后在上面的代码中使用p.map代替p.starmap

如果不方便更改函数(例如,也从其他地方调用它),那么您当然可以编写包装函数:

def f_wrap(inputs):
    a,b = inputs
    return f(a,b)

然后打电话给它。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...