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

这篇文章翻译自《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
 

最快的!!

你可能感兴趣的:(python)