博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python单线程、多线程、多进程在cpu密集型情况下耗时对比,设置成单核cpu效果
阅读量:4301 次
发布时间:2019-05-27

本文共 2926 字,大约阅读时间需要 9 分钟。

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

import timefrom multiprocessing import Processfrom 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_timedef single_add(num_list):    for i in num_list:        add_fun(i)#多线程加法@count_timedef 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_timedef 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

转载地址:http://ccxws.baihongyu.com/

你可能感兴趣的文章
vs中c++项目的配置
查看>>
c#中chart绘制曲线,柱状图等
查看>>
C# 多线程修改控件时遇到:创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
查看>>
c#中获取控件窗体句柄,获取窗体等的一些操作
查看>>
MFC 消息响应与消息处理过程
查看>>
对窗口过程函数WndProc()的一点理解
查看>>
MFC原理 消息传递
查看>>
C#winform使用进度条
查看>>
c#中代码中多线程动态创建progressbar的实例,概念很重要可扩展很多类似概念
查看>>
c#滚动条创建实例,多线程
查看>>
C#中对虚拟属性和抽象属性的重写,重写label实例
查看>>
C#中如何复制窗体到另一个项目
查看>>
最小二乘法C#实现,简单代码
查看>>
用最小二乘法拟合任意次函数曲线(C#)
查看>>
OpenCV积分图函数:integral ()详解
查看>>
开发框架-概念
查看>>
自动化设备的软件框架
查看>>
分布式系统架构简单介绍
查看>>
简述单机,集群,分布式架构区别及联系
查看>>
多线程 ---并发与并行概念总结
查看>>