簡體   English   中英

並行執行 n 次 for 循環迭代

[英]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)

這怎么能被重寫,使得nfun調用並行執行? 即對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM