[英]How can I parallelize this Python for-loop?
我正在處理需要並行化的圖像處理問題。 我看過幾個展示在 Python 中使用並行處理的例子,但所有這些例子的輸入都是一維數組。 因此,我正在尋找一種方法來並行化對圖像執行兩個過程的函數。 以下代碼是我需要進行標准化的代碼:
for i in arange(0, shape(img)[0] - window_size[0], 10):
for j in arange(0, shape(img)[1] - window_size[1], 10):
Process1 = Do_something(img[i: i + winSize[0], j: j + winSize[1]])
Process2 = Do_something(Process1)
這個嵌套循環如何並行化?
我不完全確定變量的含義或Do_something()
函數的作用是什么,但這是使其並行的一般方法:
import concurrent.futures
import functools
def process_stuff(i, j, img, winSize):
Process1 = Do_something(img[i: i + winSize[0], j: j + winSize[1]])
Process2 = Do_something(Process1)
with concurrent.futures.ProcessPoolExecutor() as executor:
for i in arange(0, shape(img)[0] - window_size[0], 10):
for j in arange(0, shape(img)[1] - window_size[1], 10):
executor.submit(process_stuff, i, j, img, winSize)
此解決方案適用於 Python 3.2 及更高版本。 舊版本可能會使用多處理模塊。
如果您希望以更有效的方式獲得返回值,這是另一種方式:
import concurrent.futures
import functools
import itertools
import operator
def process_stuff(i, j, img, winSize):
Process1 = Do_something(img[i: i + winSize[0], j: j + winSize[1]])
Process2 = Do_something(Process1)
with concurrent.futures.ProcessPoolExecutor() as executor:
i_iterator = arange(0, shape(img)[0] - window_size[0], 10)
j_iterator = arange(0, shape(img)[1] - window_size[1], 10)
product = itertools.product(i_iterator, j_iterator)
iter1, iter2 = itertools.tee(product)
i_iterator = map(operator.itemgetter(0), iter1)
j_iterator = map(operator.itemgetter(1), iter2)
do_process = functools.partial(process_stuff, img=img, winSize=winSize)
executor.map(do_process, i_iterator, j_iterator)
這有點復雜,但我在這里所做的是獲取i
和j
的所有組合的product()
,將i
和j
拆分為兩個迭代器,並將迭代器作為變量進行map()
。
更新:
我最好的選擇是,阻礙您的是將圖像轉移到不同的過程。 這只會傳輸圖像的適當部分:
import concurrent.futures
import itertools
def process_stuff(img_part):
Process1 = Do_something(img_part)
Process2 = Do_something(Process1)
with concurrent.futures.ProcessPoolExecutor() as executor:
i_iterator = arange(0, shape(img)[0] - window_size[0], 10)
j_iterator = arange(0, shape(img)[1] - window_size[1], 10)
product = itertools.product(i_iterator, j_iterator)
parts_generator = (img[i: i + winSize[0], j: j + winSize[1]]
for i, j in product)
executor.map(process_stuff, parts_generator)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.