Tim*_*ker 17 python regex caching
在回答这个问题时(并且已经阅读了类似问题的答案),我认为我知道Python如何缓存正则表达式.
但后来我想我会测试它,比较两种情况:
然而,结果是惊人的(在Python 3.3中):
>>> import timeit
>>> timeit.timeit(setup="import re",
... stmt='r=re.compile(r"\w+")\nfor i in range(10):\n r.search(" jkdhf ")')
18.547793477671938
>>> timeit.timeit(setup="import re",
... stmt='for i in range(10):\n re.search(r"\w+"," jkdhf ")')
106.47892003890324
Run Code Online (Sandbox Code Playgroud)
这慢了5.7倍!在Python 2.7中,仍然增加了2.5倍,这也超出了我的预期.
在Python 2和3之间是否更改了正则表达式的缓存?文档似乎没有暗示这一点.
Mar*_*ers 26
代码已经改变.
在Python 2.7中,缓存是一个简单的字典; 如果_MAXCACHE存储了多个项目,则在存储新项目之前清除整个缓存.缓存查找只需要构建一个简单的密钥并测试字典,请参阅2.7的实现_compile()
在Python 3.x中,缓存已被@functools.lru_cache(maxsize=500, typed=True)装饰器替换.这个装饰器做了很多工作,包括一个线程锁,调整缓存LRU队列和维护缓存统计信息(可通过访问re._compile.cache_info()).参见3.3的实现_compile()和functools.lru_cache().
其他人注意到同样的减速,并在Python bugtracker中提交了16389问题.我希望3.4再快一点; 要么lru_cache实现得到改进,要么re模块将再次移动到自定义缓存.
更新:对于修订版4b4dddd670d0,缓存更改已恢复为3.1中的简单版本.Python版本3.2.4和3.3.1包含该版本.
| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |