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占用情况:

此使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占用情况:

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

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值