Python性能优化:增大正则表达式编译缓存

Python018

Python性能优化:增大正则表达式编译缓存,第1张

关键词:正则表达式 | 缓存 | 性能优化

Python 3 的 re 库中,对正则表达式的编译函数 re.compile() 调用了私有函数 re._compile() ,但更根本上编译的计算是由 sre_compile.compile() 完成的,而 re._compile() 中对编译好的表达式进行了缓存,使用 _MAXCACHE 将缓存大小硬编码为512。以下是 re._compile() 的源码,摘自: https://github.com/python/cpython/blob/3.5/Lib/re.py (3.6,3.7里也没有变化)

在某些 大规模应用场景 下,512的缓存显然太小了一些,为了摆脱这个瓶颈但不去碰cpython的源码,我们可以自己改写 re._compile() ,从而实现自定义缓存大小( max_regex_cache ),轻松排个10000出来。原函数里很多语句都不知道干嘛用的,但照葫芦画瓢总没错。

调用方法:

进一步优化是将这个类变成Singleton(之后我应该会专门写一篇),以及 多模块共享 。

1.把range全部换成xrange

2.生成器,如 list=(item for item in fp)

3.利用psyco库,提高函数和类的运行效率。

4.字符串拼接:尽量少用“+”的方式,而采用''.join ,还有"%s"%i这样赋值的手段

5.函数的开销很大。尽量把循环放在函数内进行。而不要让每次迭代都调用函数。

6.“前提工作”先做好,比如该赋值,该拼接的,然后再引入到函数中,或者进行下面的循环。

7.尽量使用内置方法,因为内置的是C写的,效率肯定高很多

8.每当要对序列中的内容进行循环处理时,就应当尝试用列表解析来代替它,如:[i for i in xrang(10) if i%2==0]

9.学会使用itertools模块。当python中添加了迭代器后,就为常见模式提供了一个新的模块,因为它是以C语言编写,所以提供了最高效的迭代器。

--多记录一些。列表,字符串,字典,xrange,类文件对象,这些都是可迭代对象,换句话说,都可以直接用在for循环中进行迭代,如for item in open('1.txt')

--直接使用速度会快。另外,我对比了itertools里工具和xrange,比如都循环100000次打印数字,使用islice(count(),100000)均要比xrange(100000)快

--而xrange还要比range快。

10.用列表解析取代for循环。列表解析的效率等于或高于map。

11.垃圾回收机制,会对列表的操作有重大影响,如列表的append,或者列表解析。import gc,然后在数据载入模块前gc.disable(),结束后再gc.enable()。