image processing - How can I parallelize this Python for-loop? -


i'm dealing image processing problem needs parallelized. i've seen several examples showing use of parallel processing in python, inputs of examples 1-d arrays. therefore, i'm looking way parallelize function performing 2 processes on image. following code need prallelized:

for in arange(0, shape(img)[0] - window_size[0], 10):     j in arange(0, shape(img)[1] - window_size[1], 10):         process1 = do_something(img[i: + winsize[0], j: j + winsize[1]])         process2 = do_something(process1) 

how nested loop can parallelized?

i'm not entirely sure variables mean or do_something() function general way make parallel:

import concurrent.futures import functools  def process_stuff(i, j, img, winsize):     process1 = do_something(img[i: + winsize[0], j: j + winsize[1]])     process2 = do_something(process1)  concurrent.futures.processpoolexecutor() executor:     in arange(0, shape(img)[0] - window_size[0], 10):         j in arange(0, shape(img)[1] - window_size[1], 10):             executor.submit(process_stuff, i, j, img, winsize) 

this solution fitted python 3.2 , above. older versions may use multiprocessing module.

if wish more efficient way allowing return values too, way:

import concurrent.futures import functools import itertools import operator  def process_stuff(i, j, img, winsize):     process1 = do_something(img[i: + winsize[0], j: j + winsize[1]])     process2 = do_something(process1)  concurrent.futures.processpoolexecutor() 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) 

it's bit more complicated did here product() of combinations of i , j, split i , j 2 iterators, , map() iterators variables.

update:

my best bet thing holding transfer of image different processes. transfer appropriate part of image:

import concurrent.futures import itertools  def process_stuff(img_part):     process1 = do_something(img_part)     process2 = do_something(process1)  concurrent.futures.processpoolexecutor() 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: + winsize[0], j: j + winsize[1]]                        i, j in product)      executor.map(process_stuff, parts_generator) 

Comments