今天再对比下单线程、多线程、多进程再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