========================= How to parallelize loops? ========================= In image processing, we frequently apply the same algorithm on a large batch of images. Let us define an example. .. code-block:: python from skimage import data, color from skimage.restoration import denoise_tv_chambolle from skimage.feature import hog def tasks(image): """ Apply some functions. """ image = denoise_tv_chambolle(image, weight=0.1, multichannel=True) fd, hog_image = hog(color.rgb2gray(image), orientations=8, pixels_per_cell=(16, 16), cells_per_block=(1, 1), visualise=True) # Prepare images hubble = data.hubble_deep_field() width = 10 pics = [hubble[:,slice:slice+width] for slice in range(0, 1000, width)] To call the function ``tasks`` on each element of the list ``pics``, it is usual to write a for loop. To measure the execution time of this loop, a function is defined and called with ``timeit``. .. code-block:: python def classic_loop(): for image in pics: tasks(image) import timeit print("classic_loop():", timeit.timeit("classic_loop()", setup="from __main__ import (classic_loop, tasks, pics)", number=1)) Another equivalent way to code this loop is to use a comprehension list which has the same efficiency. .. code-block:: python def comprehension_loop(): [tasks(image) for image in pics] print("comprehension_loop():", timeit.timeit("comprehension_loop()", setup="from __main__ import (comprehension_loop, tasks, pics)", number=1)) ``joblib`` is a library providing an easy way to parallelize for loops once we have a comprehension list. The number of jobs can be specified. .. code-block:: python from joblib import Parallel, delayed def joblib_loop(): Parallel(n_jobs=4)(delayed(tasks)(i) for i in pics) print("joblib_loop():", timeit.timeit("joblib_loop()", setup="from __main__ import (joblib_loop, tasks, pics)", number=1))