pangxia75 发表于 2017-5-2 12:22:53

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('^+$', 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('^+$').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
   最快的!!
页: [1]
查看完整版本: python性能调优---优化正则表达式