首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

How to parallelize loops

在图像处理中,我们经常在大量图像上应用相同的算法。在这一段中,我们建议使用joblib来并行化循环。这是一个重复性任务的例子:

代码语言:javascript
复制
from skimage import data, color, util
from skimage.restoration import denoise_tv_chambolle
from skimage.feature import hog

def task(image):
    """
    Apply some functions and return an image.
    """
    image = denoise_tv_chambolle(image[0][0], 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)
    return hog_image


# Prepare images
hubble = data.hubble_deep_field()
width = 10
pics = util.view_as_windows(hubble, (width, hubble.shape[1], hubble.shape[2]), step=width)

task在列表的每个元素上调用该函数pics,通常需要编写一个for循环。为了衡量这个循环的执行时间,你可以使用ipython并用%timeit。来衡量执行时间。

代码语言:javascript
复制
def classic_loop():
    for image in pics:
        task(image)


%timeit classic_loop()

编码此循环的另一个等效方法是使用具有相同效率的理解列表。

代码语言:javascript
复制
def comprehension_loop():
    [task(image) for image in pics]

%timeit comprehension_loop()

joblib是一个库,提供一个简单的方法来并行化循环,一旦我们有一个理解列表。作业的数量可以被指定。

代码语言:javascript
复制
from joblib import Parallel, delayed
def joblib_loop():
    Parallel(n_jobs=4)(delayed(task)(i) for i in pics)

%timeit joblib_loop()

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com