[英]executing n iterations of for loop in parallel
假設我們在 python 中有一個嵌套for
循環,其中最里面的循環調用了一些 function 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)
開始如何以最Pythonic的方式實現這一點?
您可以使用multiprocessing
模塊:
from multiprocessing import Pool
from itertools import product
if __name__ == "__main__":
l1 = ['a', 'b', 'c', 'd', 'e']
l2 = [1, 2, 3]
n = 2
with Pool(n) as pool:
pool.starmap(fun, product(l1, l2))
使用product
我們連續創建所有對:
>>> list(product(['a', 'b'], [1, 2]))
[('a', 1), ('a', 2), ('b', 1), ('b', 2)]
然后,我們可以創建一個包含n
進程的Pool
,並使用starmap
將每一對傳遞給fun
。
通過創建Pool
並傳遞第一個參數n
,我們有n
進程,它們按順序從product
中獲取每個元素,因此這會產生您正在尋找的效果 - 每當其中一個釋放時,它將采用下一行.
在列表理解中組合參數。 然后可以使用multiprocessing.Pool.starmap
調用一個 function 和多個 arguments。
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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.