python单线程、多线程、多进程在cpu密集型情况下耗时对比,设置成单核cpu效果

 今天再对比下单线程、多线程、多进程再cpu密集型的情况下的耗时,果然有时候多线程比单线程还慢。。。还是多进程靠谱

import time
from multiprocessing import Process
from threading import  Thread

#装饰器计算函数执行时间
def count_time(fun):
    def warpper(*args):
        s_time=time.time()
        fun(*args)
        e_time=time.time()
        t_time=e_time-s_time
        print('%s耗时:%s'%(fun.__name__,t_time))
    return warpper

#加法操作
def add_fun(num):
    for i in range(50000000):
        num+=i
    print(num)
    return num

#单线程加法
@count_time
def single_add(num_list):
    for i in num_list:
        add_fun(i)
#多线程加法
@count_time
def thread_add(num_list):
    thread_list=[]
    for i in num_list:
        t=Thread(target=add_fun,args=[i])
        t.start()
        thread_list.append(t)
    for t in thread_list:
        t.join()
#多进程加法
@count_time
def process_add(num_list):
    process_list=[]
    for i in num_list:
        p=Process(target=add_fun,args=[i])
        p.start()
        process_list.append(p)
    for p in process_list:
        p.join()

if __name__ == '__main__':
    # num_list=[1,2,3,4,5,6,7,8]
    num_list = [1, 2, 3, 4]
    single_add(num_list)
    thread_add(num_list)
    process_add(num_list)


上一个执行过程图,明显看出单线程执行是按顺序执行的,每次耗时都差不多,

多线程一个cpu核心负责轮换执行,一个线程执行一小会儿,所以这几个结果基本上是陆续打出,

而多线程情况下,8核CPU跑4个进程,每个进程都相互独立,所以几乎是同一时间打印出结果

 

#8组数据对比结果:

19999999900000001
19999999900000002
19999999900000003
19999999900000004
19999999900000005
19999999900000006
19999999900000007
19999999900000008
single_add耗时:84.57584691047668
19999999900000001
19999999900000005
19999999900000004
19999999900000008
19999999900000007
19999999900000003
19999999900000002
19999999900000006
thread_add耗时:90.01574563980103
19999999900000008
19999999900000004
19999999900000003
19999999900000007
19999999900000006
19999999900000002
19999999900000001
19999999900000005
process_add耗时:30.791792392730713

 在对比一下单线程、多线程、多进程在跑8组数据是的cpu使用率。明显多进程把8个cpu都利用上了,直接100%。

 

突发奇想想看看在单核cpu的情况下是什么效果,设置单核cpu可以通过msconfig高级引导设置或者直接任务管理器中对某个程序分配单独一个cpu,我给pycharm单独分配了一个cpu

单核cpu的条件下单线程、多线程、多进程整体时间基本在一个数量级了,没有倍数关系了,多进程一般也比多线程耗时时间长,也印证了线程开销更大的理论。

运行效果动图如下,从视觉效果上来看感觉cpu对于进程的切换更平均,虽然不是像多核一下瞬间蹦出所有结果,但是时间间隔非常短,而线程就会陆续输出每个结果。从资源消耗上看,单核下进程确实比线程消耗资源也更多。

 

 

单核cpu情况的两组数据:

4个数的耗时:

1249999975000001
1249999975000002
1249999975000003
1249999975000004
single_add耗时:9.950999975204468
1249999975000004
1249999975000001
1249999975000002
1249999975000003
thread_add耗时:8.997999906539917
1249999975000001
1249999975000002
1249999975000003
1249999975000004
process_add耗时:9.460000038146973

8个数的耗时:

1249999975000001
1249999975000002
1249999975000003
1249999975000004
1249999975000005
1249999975000006
1249999975000007
1249999975000008
single_add耗时:19.502000093460083
1249999975000001
1249999975000006
1249999975000002
1249999975000008
1249999975000005
1249999975000004
1249999975000003
1249999975000007
thread_add耗时:18.31500005722046
1249999975000001
1249999975000003
1249999975000004
1249999975000007
1249999975000006
1249999975000002
1249999975000008
1249999975000005
process_add耗时:18.957000017166138

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值