Python库性能测试之re和lxml效率对比

前言 闲来无事,想起来之前在简书发过的文章还没搬过来,正想搬一篇lxml和re效率对比的,结果发现代码没了,索性重写一次。
先上结果:

只做解析加取数据,re比lxml快了300%!
解析加pandas处理数据,re比lxml快40%
其实这个测试结果应该没什么好纠结的,预计应该是re优于lxml,二者都优于beautifulsoup。
因为很少用beautifulsoup,所以这次没测试它。
注意事项 为了避免网络波动,测试时不应该把网络请求时间计算进去,这里使用参数传入要解析的HTML。
另外,解析语句的写法优劣会在极大程度上影响结果,所以一般工作重点应该放在表达式的写法上。
小技巧 导出list列表数据的时候直接来一个pandas,省时省力
代码
# -*- encoding: utf-8 -*- ''' @File:test-re-lxml.py @Time:2021年12月18日 22:33:10 星期六 @Author:erma0 @Version :1.0 @Link:https://erma0.cn @Desc:测试re lxml效率 '''import re import time import pandas as pd import requests from lxml import etree from itertools import zip_longest# ahtml = requests.get('http://test.cn/').text ahtml = ''' 教育网盘 - 锐客网 Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比Python库性能测试之re和lxml效率对比
图标 文件名 所属用户 大小 更新时间
Python库性能测试之re和lxml效率对比1汽包安装施工技术交底.pdfHNAZ871.49 K2021-11-23
水冷壁安装施工技术交底.docPython库性能测试之re和lxml效率对比HNAZ139.66 K2021-11-23
水压试验技术交底 - 副本.docPython库性能测试之re和lxml效率对比HNAZ173.44 K2021-11-23
烟道安装施工技术交底 - 副本.docPython库性能测试之re和lxml效率对比HNAZ130.84 K2021-11-23
(最终)山西东义干熄焦工程施工组织设计0610.docPython库性能测试之re和lxml效率对比HNAZ2.4 M2021-11-23
东义干熄焦锅炉水压试验方案(1)10.10.docxPython库性能测试之re和lxml效率对比HNAZ103.62 K2021-11-23
山西干熄焦锅炉水冷壁安装方案0507.docPython库性能测试之re和lxml效率对比HNAZ711.05 K2021-11-23
东义汽包吊装施工方案 0710.docxPython库性能测试之re和lxml效率对比HNAZ989.66 K2021-11-23
PQR044(12Cr2MoG,273×13)SMAW+GT...Python库性能测试之re和lxml效率对比HNAZ20.24 M2021-11-23
锅炉焊接施工方案0525.docPython库性能测试之re和lxml效率对比HNAZ711.5 K2021-11-23
山西东义锅炉钢架安装施工方案0520.docPython库性能测试之re和lxml效率对比HNAZ1.08 M2021-11-23
东义230T干熄焦余热锅炉安装方案.docxPython库性能测试之re和lxml效率对比HNAZ418.04 K2021-11-23
冬季施工方案 11.11.docxPython库性能测试之re和lxml效率对比HNAZ47.07 K2021-11-23
1汽包安装安全技术交底.pdfHNAZ908.46 K2021-11-23
余热锅炉入口烟道安装安全技术交底.docxPython库性能测试之re和lxml效率对比HNAZ50.87 K2021-11-23
余热锅炉钢结构安全技术交底.docxPython库性能测试之re和lxml效率对比HNAZ50.86 K2021-11-23
吊装指挥安全交底.docxPython库性能测试之re和lxml效率对比HNAZ13.59 K2021-11-23
水压试验安全技术交底.docxPython库性能测试之re和lxml效率对比HNAZ48.24 K2021-11-23
移动脚手架安全技术交底 - 10.31.docxPython库性能测试之re和lxml效率对比HNAZ45.41 K2021-11-23
余热锅炉水冷壁安全技术交底.docxPython库性能测试之re和lxml效率对比HNAZ50.98 K2021-11-23
总共记录数:3276页码:...    11    12    13    14    15    16    17    18    19    20        ...第一页上一页下一页最末页第16页/共164页
'''def get_lxml(html): d = etree.HTML(html) link = d.xpath('//tr/td[2]/a[1]/@href') title = d.xpath('//tr/td[2]/a[1]/text()') passwd = d.xpath('//tr/td[2]/font/text()') user = d.xpath('//tr/td[3][@width="120"]/text()') size = d.xpath('//tr/td[4]/div/text()') time = d.xpath('//tr/td[5]/div/text()')datas = list(zip_longest(link, title, passwd, user, size, time, fillvalue='')) datas = pd.DataFrame(datas, columns=['link', 'title', 'passwd', 'user', 'size', 'time']) datas['link'] = datas['link'].str.strip() datas.to_csv('result-lxml.csv') # print(len(datas)) return datasdef get_re(html): datas = [] # datas= r.findall(html) datas = re.findall(rep, html, re.S) # for data in datas:# link, title, passwd, user, time #pass # print(len(datas)) datas = pd.DataFrame(datas, columns=['link', 'title', 'passwd', 'user', 'size', 'time']) datas['link'] = datas['link'].str.strip() datas.to_csv('result-re.csv') return datasif __name__ == '__main__': rep = r"([\s\S]*?)[\s\S]*?([\s\S]*?)[\s\S]*?center>([\s\S]*?)([\s\S]*?)([\s\S]*?)" r = re.compile(rep, re.S) for name, function in [('lxml', get_lxml), ('re', get_re)]: start = time.time() for i in range(500): function(ahtml) # function(ahtml) end = time.time() print(name, end - start)

结果
lxml 2.1219968795776367 re 1.341965675354004

re比lxml快了接近40%
再测试一下纯解析的效率 因为上面代码中计算了pandas的数据处理时间,使用下面把它注释掉再测试一下,代码如下:
def get_lxml(html): d = etree.HTML(html) link = d.xpath('//tr/td[2]/a[1]/@href') title = d.xpath('//tr/td[2]/a[1]/text()') passwd = d.xpath('//tr/td[2]/font/text()') user = d.xpath('//tr/td[3][@width="120"]/text()') size = d.xpath('//tr/td[4]/div/text()') time = d.xpath('//tr/td[5]/div/text()')def get_re(html): # datas= r.findall(html) datas = re.findall(rep, html, re.S)

结果2
lxml 0.6280360221862793 re 0.15498137474060059

【Python库性能测试之re和lxml效率对比】单纯解析加取数据,re比lxml快了300%!

    推荐阅读