本文首发于知乎
首先要说明IO密集型任务和计算密集型任务的区别
- IO指
input output
,IO密集型任务包括文件读写(磁盘IO)、网页请求(网络IO)等。这类任务计算量较小,有比较多的等待时间,用多线程可以较大提高运行效率 - 计算密集型任务是指CPU计算占据主要运行时间,这类任务使用python多线程无法提高效率
下面分为CPU密集型任务、文件读写、网络请求三部分测试多线程对程序运行效率的改进程度
首先导入模块,并定义基本运行函数
import requests
from bs4 import BeautifulSoup
import time
from threading import Thread
import numpy as np
# 计算从1加到5000000
def cal(a = None): # 参数i没用,只是为了和后面统一
s = 0
for i in range(5000000):
s = s + i
# 500000次写入文件
def file(a = None): # 参数i没用,只是为了和后面统一
with open('try.txt', 'w') as f:
for i in range(500000):
f.write('abcd\n')
# 抓取豆瓣top250的10个网页
def gettitle(a):
url = 'https://movie.douban.com/top250?start={}&filter='.format(a*25)
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
lis = soup.find('ol', class_='grid_view').find_all('li')
for li in lis:
title = li.find('span', class_="title").text
# 分别将上面三个函数传入,计算10次,返回不使用多线程的运行总时间
def no_thread(func):
t = time.time()
for i in range(10):
func(i)
duration = time.time() - t
return duration
# 分别将上面三个函数传入,计算10次,返回使用多线程的运行总时间
def thread(func):
t = time.time()
ths = []
for i in range(10):
th = Thread(target = func, args = (i, ))
th.start()
ths.append(th)
for th in ths:
th.join()
duration = time.time() - t
return duration
复制代码
每一项做5次试验,返回每次时间和5次平均值
def get_duration(func_th, func):
l = []
for _ in range(5):
l.append(func_th(func))
mean_duration = '%.2f' % np.mean(l)
all_duration = ['%.2f' % i for i in l]
return mean_duration, all_duration
复制代码
调用函数计算
# CPU密集任务对比
get_duration(no_thread, cal)
# ('5.67', ['6.72', '5.54', '5.14', '5.15', '5.79'])
get_duration(thread, cal)
# ('5.38', ['6.17', '6.09', '5.29', '4.70', '4.65'])
# 文件读写任务对比
get_duration(no_thread, file)
# ('6.26', ['6.24', '5.96', '6.47', '6.07', '6.55'])
get_duration(thread, file)
# ('5.82', ['6.27', '6.12', '5.46', '5.35', '5.90'])
# 网络请求任务对比
get_duration(no_thread, gettitle)
# ('4.01', ['4.06', '3.82', '4.43', '4.00', '3.74'])
get_duration(thread, gettitle)
# ('1.19', ['1.07', '1.23', '1.33', '0.93', '1.39'])
复制代码
从上面的结果我们可以看出
- 多线程对网络请求任务效率改进非常明显
- 对文件读写任务有少量改进
- 对计算密集型任务几乎没有改进
欢迎关注我的知乎专栏
专栏主页:python编程
专栏目录:目录
版本说明:软件及包版本说明