视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python中单线程、多线程和多进程的效率对比实验
2020-11-27 14:17:14 责编:小采
文档


对比实验

资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率

(1)引入所需要的模块

import requests
import time
from threading import Thread
from multiprocessing import Process

(2)定义CPU密集的计算函数

def count(x, y):
 # 使程序完成150万计算
 c = 0
 while c < 500000:
 c += 1
 x += x
 y += y

(3)定义IO密集的文件读写函数

def write():
 f = open("test.txt", "w")
 for x in range(5000000):
 f.write("testwrite
")
 f.close()

def read():
 f = open("test.txt", "r")
 lines = f.readlines()
 f.close()

(4) 定义网络请求函数

_head = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.25.116 Safari/537.36'}
url = "http://www.tieba.com"
def http_request():
 try:
 webPage = requests.get(url, headers=_head)
 html = webPage.text
 return {"context": html}
 except Exception as e:
 return {"error": e}

(5)测试线性执行IO密集操作、CPU密集操作所需时间、网络请求密集型操作所需时间

# CPU密集操作
t = time.time()
for x in range(10):
 count(1, 1)
print("Line cpu", time.time() - t)

# IO密集操作
t = time.time()
for x in range(10):
 write()
 read()
print("Line IO", time.time() - t)

# 网络请求密集型操作
t = time.time()
for x in range(10):
 http_request()
print("Line Http Request", time.time() - t)

输出

CPU密集:95.6059999466、91.57099986076355 92.52800011634827、 99.96799993515015

IO密集:24.25、21.76699995994568、21.769999980926514、22.060999870300293

网络请求密集型: 4.519999980926514、8.5639991281128、4.371000051498413、4.522000074386597、14.671000003814697

(6)测试多线程并发执行CPU密集操作所需时间

counts = []
t = time.time()
for x in range(10):
 thread = Thread(target=count, args=(1,1))
 counts.append(thread)
 thread.start()

e = counts.__len__()
while True:
 for th in counts:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print(time.time() - t)

Output: 99.9240000248 、101.200017738342、102.32200002670288

(7)测试多线程并发执行IO密集操作所需时间

def io():
 write()
 read()

t = time.time()
ios = []
t = time.time()
for x in range(10):
 thread = Thread(target=count, args=(1,1))
 ios.append(thread)
 thread.start()

e = ios.__len__()
while True:
 for th in ios:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print(time.time() - t)

Output: 25.69700002670288、24.02400016784668

(8)测试多线程并发执行网络密集操作所需时间

t = time.time()
ios = []
t = time.time()
for x in range(10):
 thread = Thread(target=http_request)
 ios.append(thread)
 thread.start()

e = ios.__len__()
while True:
 for th in ios:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print("Thread Http Request", time.time() - t)

Output: 0.74199985782471、0.3839998245239258、0.3900001049041748

(9)测试多进程并发执行CPU密集操作所需时间

counts = []
t = time.time()
for x in range(10):
 process = Process(target=count, args=(1,1))
 counts.append(process)
 process.start()
e = counts.__len__()
while True:
 for th in counts:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print("Multiprocess cpu", time.time() - t)

Output: 54.342000007629395、53.437999963760376

(10)测试多进程并发执行IO密集型操作

t = time.time()
ios = []
t = time.time()
for x in range(10):
 process = Process(target=io)
 ios.append(process)
 process.start()

e = ios.__len__()
while True:
 for th in ios:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print("Multiprocess IO", time.time() - t)

Output: 12.509000062942505、13.0590000152587

(11)测试多进程并发执行Http请求密集型操作

t = time.time()
httprs = []
t = time.time()
for x in range(10):
 process = Process(target=http_request)
 ios.append(process)
 process.start()

e = httprs.__len__()
while True:
 for th in httprs:
 if not th.is_alive():
 e -= 1
 if e <= 0:
 break
print("Multiprocess Http Request", time.time() - t)

Output: 0.5329999923706055、0.47600007057194

实验结果

通过上面的结果,我们可以看到:

多线程在IO密集型的操作下似乎也没有很大的优势(也许IO操作的任务再繁重一些就能体现出优势),在CPU密集型的操作下明显地比单线程线性执行性能更差,但是对于网络请求这种忙等阻塞线程的操作,多线程的优势便非常显著了

多进程无论是在CPU密集型还是IO密集型以及网络请求密集型(经常发生线程阻塞的操作)中,都能体现出性能的优势。不过在类似网络请求密集型的操作上,与多线程相差无几,但却更占用CPU等资源,所以对于这种情况下,我们可以选择多线程来执行

下载本文
显示全文
专题