多线程效率测试

本文首发于知乎

首先要说明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编程

专栏目录:目录

版本说明:软件及包版本说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值