Python 并行执行for循环的n次迭代
我们假设python中有一个嵌套的Python 并行执行for循环的n次迭代,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我们假设python中有一个嵌套的for循环,最里面的循环调用一些函数fun: for x1 in ['a','b','c','d','e']: for x2 in [1,2,3]: fun(x1,x2) 如何重写它,使n调用fun并行执行? 即,对于n==2,执行顺序为: fun('a',1)和fun('a',2)并行运行 当其中一个终止时,fun('a',3)启动 当其中一个终止时,fun('b',1)启动 。。。等等 如何以最具python风格的方式实现这一点
for
循环,最里面的循环调用一些函数fun
:
for x1 in ['a','b','c','d','e']:
for x2 in [1,2,3]:
fun(x1,x2)
如何重写它,使n
调用fun
并行执行?
即,对于n==2
,执行顺序为:
和fun('a',1)
并行运行fun('a',2)
- 当其中一个终止时,
启动fun('a',3)
- 当其中一个终止时,
启动fun('b',1)
- 。。。等等
来自多处理导入池的
来自itertools进口产品
如果名称=“\uuuuu main\uuuuuuuu”:
l1=['a','b','c','d','e']
l2=[1,2,3]
n=2
将池(n)作为池:
星图(乐趣,产品(l1,l2))
使用创建一行中的所有对:
>>列表(产品(['a',b',[1,2]))
[('a',1),('a',2),('b',1),('b',2)]
然后,我们可以使用n
进程创建一个,并使用函数将每一对传递给fun
通过创建并传递第一个参数n
我们有n
进程,这些进程从By顺序中获取每个元素,因此这正好创建了您想要的效果-每当其中一个元素释放时,它将获取下一个元素对。您可以使用该模块:
来自多处理导入池的
来自itertools进口产品
如果名称=“\uuuuu main\uuuuuuuu”:
l1=['a','b','c','d','e']
l2=[1,2,3]
n=2
将池(n)作为池:
星图(乐趣,产品(l1,l2))
使用创建一行中的所有对:
>>列表(产品(['a',b',[1,2]))
[('a',1),('a',2),('b',1),('b',2)]
然后,我们可以使用n
进程创建一个,并使用函数将每一对传递给fun
通过创建并传递第一个参数
n
,我们有n
进程从By顺序中获取每个元素,因此这正好创建了您想要的效果-只要其中一个释放出来,它就会获取下一个参数。在列表中组合参数。然后可以使用multiprocessing.Pool.starmap
调用具有多个参数的函数
from multiprocessing import Pool
x1 = ['a','b','c','d','e']
x2 = [1,2,3]
param_combinations = [(i, j) for i in x1 for j in x2]
def func(x, y):
return f'{x}_{y}'
with Pool(processes=3) as p:
results = p.starmap(func, param_combinations)
>>>results
['a_1',
'a_2',
'a_3',
'b_1',
'b_2',
'b_3',
'c_1',
'c_2',
'c_3',
'd_1',
'd_2',
'd_3',
'e_1',
'e_2',
'e_3']
在列表中组合参数。然后可以使用
multiprocessing.Pool.starmap
调用具有多个参数的函数
from multiprocessing import Pool
x1 = ['a','b','c','d','e']
x2 = [1,2,3]
param_combinations = [(i, j) for i in x1 for j in x2]
def func(x, y):
return f'{x}_{y}'
with Pool(processes=3) as p:
results = p.starmap(func, param_combinations)
>>>results
['a_1',
'a_2',
'a_3',
'b_1',
'b_2',
'b_3',
'c_1',
'c_2',
'c_3',
'd_1',
'd_2',
'd_3',
'e_1',
'e_2',
'e_3']
多处理多处理