如何解决两个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)
然后打电话给它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。