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
Post a Comment