Python 两个for循环的多重处理

Python 两个for循环的多重处理,python,python-multiprocessing,physics,python-2.x,Python,Python Multiprocessing,Physics,Python 2.x,我正在努力用python(2.7)实现一个算法来并行处理一个物理问题。在两个变量(比如a和b)上有一个参数空间,我想在上面运行我编写的程序f(a,b),它返回另外两个变量c和d 到目前为止,我使用a和b上的两个for-循环来计算c和d的两个数组,然后将它们保存为txt文档。由于参数空间相对较大,并且其中一个点f(a,b)的每次计算都需要相对较长的时间,因此最好使用我的8个CPU内核进行参数空间扫描 我读过关于多线程和多处理的书,似乎我正在寻找的是多处理。您知道这个应用程序的一个好的代码示例吗?或

我正在努力用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]
p.starmap
返回一个2元组列表,然后从中提取c和d值

这假设您将在返回所有结果后在主程序中执行文件I/O


附录

如果
p.starmap
不可用(Python2),则可以将函数更改为接受单个输入(2元素元组):

然后使用
p.map
代替上述代码中的
p.starmap

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

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

在Python中,您将无法将所有CPU核心用于多线程。您需要进行多重处理。谢谢。是的,我会在我的问题中纠正这一点。从2020年1月1日起,不再支持Python 2.x版本。考虑升级到Python 3.XI,我必须使用只在Python上工作的废弃软件包。2@JacobK:stackoverflow仍然支持Python 2<代码>;嗯,我想我有点太快了:当我使用Python3测试p.starmap时,它对我很有效。你能想出一个没有星图功能的解决方案吗?@CarloTasillo你可以使用
p.map
,然后函数接受一个参数(一个2元素元组)。只需在函数开始时将其解压到
a,b
。@CarloTasillo现在为答案添加了一个附录。非常感谢,现在一切都正常工作了!
def f(inputs):
    a, b = inputs
    # ... etc as before ...
def f_wrap(inputs):
    a, b = inputs
    return f(a, b)