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