如何提高Python程序运行效率:基于多进程multiprocessing模块

Python版本:3.70;操作系统:Windows10

(出发点:通过multiprocessing模块用最简单的方式来让你提高程序运行效率)

来了更好的感受到multiprocessing模块提升运行效率的效果,将提出一个问题,并采用两种不同解决方式进行对比来说明。

需解决问题:计算变量i从0开始,不断+1,直到i=20000000,并重复3次。

(一)普通情况

import time

def hello(num):
    i = 0
    while i < num:
        i+=1
    print(i)

if __name__ ==  '__main__':
    ts = time.time()
    hello(20000000) # 第一次计算
    hello(20000000) # 第二次计算
    hello(20000000) # 第三次计算
    te = time.time()
    print("using time: "+str(te - ts)+"s")

运行结果:

(二)使用multiprocessing模块

import multiprocessing
import time

def hello(num):
    i = 0
    while i < num:
        i+=1
    print(i)

if __name__ ==  '__main__':
    ts = time.time()
    i = 3
    while i >= 1:
        p = multiprocessing.Process(target=hello,args=(20000000, )) # target=需调用函数名,args=函数参数
        p.start() # 启动进程
        i-=1
    p.join()
    te = time.time()
    print("using time: "+str(te - ts)+"s")

运行结果:

注意事项:

1、如果是windows系统, multiprocessing.Process需在if __name__ ==  '__main__':下使用

2、args后面的参数必须是tuple类型,在这里可以认为是为整数参数20000000添加了小括号和逗号

3、这里的p.join()的对象是在while循环中i=1时的p,也就是最后一次循环的p,所以这里是等待最后一次p结束后,会运行下一条语句,所以如果前面已经开始的进程需要的运行时间比后面的要长得多,就有可能出现串行的情况。比如下图,我将[4*10000000,0.5*10000000,1*10000000]按顺序迭代作为函数参数输入,你会发现第一个开始运行的以4*10000000作为参数的进程却最后输出并且还在using time: 1.69600...这条输出语句的下面

这是因为4*10000000的计算量远大于其他两个(0.5*10000000和1*10000000)的计算量,所以计算花费的时间也比较多。因此,在最后一条语句(1*10000000)计算完成后,p.join()就识别出此时的p函数(以1*10000000为参数的函数)结束了,可以进行下一条语句了,所以就输出了using time: 1.69600...,但第一个p函数(以4*10000000为参数的函数,即第一条开始的进程)还在计算中,所以就出现了串行现象

所以,如果你想要让你规定的全部进程结束的后再进行下一条语句,就需要使用multiprocessing模块的进程池。关于进程池我将在另一片文章分享,请大家持续关注。

 

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值