4行代码实现Python并行,n倍加速运行速度!

目前在深度学习与图像处理领域,常常需要对大量图片进行批量处理。若按照常规的脚本编写方法进行处理,往往会消耗大量时间。这里我教大家一个非常简单的方法实现脚本并行,最大化利用你的多核cpu来n倍加速你的脚本。

我们举例来说明:

首先,我们在这里处理19000多张图片,将他们统一resize到16x16。我们立刻会想到使用for循环来完成,代码如下:

import cv2,glob,datetime
from multiprocessing import Pool

def resize(InputPath):
    ImgOri = cv2.imread(InputPath)
    ImgResize = cv2.resize(ImgOri,(28,28))
    cv2.imwrite(InputPath.replace('',''),ImgResize) #改名储存,可按照自己喜好随意设置

if __name__ == '__main__':
    start = datetime.datetime.now()
    PicsPath = r'E:\pics\*'#正则表达式匹配该文件夹下的所有文件,也就是图片
    Pics = glob.glob(PicsPath)#将该文件夹下的所有文件名储存在列表中
    for pic in Pics:
        resize(pic)
    end = datetime.datetime.now()
    print(end-start)

这时我们运行,结束时会打印运行时间:

也就是约83秒

我们看下cpu占用情况:

4行代码实现Python并行,n倍加速运行速度!_第1张图片

此使CPU占用率为26%,远没有发挥最大性能。

OK,现在我们尝试使用并行来完成。

这里,我们需要用到multiprocessing,python自带的基于进程的并行库,需要看原理的小伙伴可以去官方文档看看,传送门如下,此处不解释~

传送门:https://docs.python.org/zh-cn/3.7/library/multiprocessing.html

直接上代码:

import cv2,glob,datetime
from multiprocessing import Pool

def resize(InputPath):
    ImgOri = cv2.imread(InputPath)
    ImgResize = cv2.resize(ImgOri,(16,16))
    cv2.imwrite(InputPath.replace('',''),ImgResize) 

if __name__ == '__main__':
    start = datetime.datetime.now()
    PicsPath = r'E:\pis\*'
    Pics = glob.glob(PicsPath)
    pool = Pool()
    pool.map(resize,Pics)
    pool.close()
    pool.join()
    end = datetime.datetime.now()
    print(end-start)

直到获取图片名列表的步骤都与之前一样,这里我们不使用for循环,使用pool中的map方法来批量传入变量进行处理。

pool.map函数有两个形参,第一个形参为待处理函数名,第二个形参为变量列表。

OK,我们来看看处理时间:

12秒!几乎是前面是7倍!

再来看看CPU占用情况:

4行代码实现Python并行,n倍加速运行速度!_第2张图片

可以看到这里有多个脚本进程并行,cpu占用率几乎为100%,最大化处理性能。

总之,多进程并行能够非常有效地提升密集型IO处理的效率,建议大家在脚本运行过慢的情况下尝试此种方法,能非常有效地节约时间!

你可能感兴趣的:(深度学习,计算机视觉,python)