簡體   English   中英

如何並行化這個 Python for 循環?

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

這有點復雜,但我在這里所做的是獲取ij的所有組合的product() ,將ij拆分為兩個迭代器,並將迭代器作為變量進行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.

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