python性能调优---优化正则表达式

本文是《Dive into Python》18章性能调优的学习笔记,探讨了如何通过编译正则表达式提升Python代码的性能。经过多次优化测试,发现预编译正则表达式在不变的情况下可提升性能,但过度的编译操作可能会因解释器开销反而降低效率。最终找到了最优的优化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章翻译自《Dive in Python》18章性能调优,相当于一个学习笔记。

 

代码1

 

allChars = string.uppercase + string.lowercase
if not re.search('^[%s]+$' % allChars, source):
    return "0000"

 

 测试性能

 

C:\samples\soundex\stage1>python soundex1a.py
Woo W000 19.3356647283
Pilgrim P426 24.0772053431
Flingjingwaller F452 35.0463220884

 注:这个性能时间是整个代码的测试时间,代码功能自己看书

 

优化代码2

 

if not re.search('^[A-Za-z]+$', source):
return "0000"

 测试性能

 

C:\samples\soundex\stage1>python soundex1b.py
Woo W000 17.1361133887
Pilgrim P426 21.8201693232
Flingjingwaller F452 32.7262294509

 优化代码3

 

isOnlyChars = re.compile('^[A-Za-z]+$').search
def soundex(source):
    if not isOnlyChars(source):
         return "0000"

 测试性能

 

C:\samples\soundex\stage1>python soundex1c.py
Woo W000 14.5348347346
Pilgrim P426 19.2784703084
Flingjingwaller F452 30.0893873383

原因: 上面的正则表达式可以被编译以获得更好的性能。因为在函数调用过程中表达式没有改变。

可知如果你的表达式不变的话,用compile可以比search获得更好的性能

 

优化代码4

 

 

if not source:
    return "0000"
for c in source:
    if not ('A' <= c <= 'Z') and not ('a' <= c <= 'z'): 
        return "0000"

 测试性能

 

C:\samples\soundex\stage1>python soundex1d.py
Woo W000 15.4065058548
Pilgrim P426 22.2753567842
Flingjingwaller F452 37.5845122774

 时间反而增加了。原因:

正则表达式的引擎是用c写的,直接运行在本地。而循环是用python写的,需要被python解释器运行。即使这个循环很简单,还是不能弥补编译的开销。

 

优化代码5

 

if (not source) and (not source.isalpha()):
    return "0000"

 测试性能

 

C:\samples\soundex\stage1>python soundex1e.py
Woo W000 13.5069504644
Pilgrim P426 18.2199394057
Flingjingwaller F452 28.9975225902
 

最快的!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值