re
在Python 中使用时清除缓存的意义何在.它对性能或内存管理有帮助吗?如果我们忽略它会发生什么.哪里应该re.purge()
叫?
大多数代码都不需要担心清除re
模块缓存.它带来的内存利益非常小,如果你清除它,实际上可能会损害性能.
当您直接使用顶级函数而不是使用时,缓存用于存储已编译的正则表达式对象.例如,如果您在循环中使用,那么模块将只编译一次并将其存储在缓存中,从而避免每次都必须重新编译模式.re.*
re.compile(pattern)
re.search(r'<some pattern>', string_value)
re
'<some pattern>'
实际上,有多少这样的对象被缓存以及如何管理缓存是一个实现细节,但正则表达式对象是轻量级对象,最多占用几百个字节,Python不会存储超过几百个这些(Python 3.7存储最多512个).
缓存也是自动管理的,因此通常根本不需要清除.如果您特别需要在涉及re.*
函数的重复计时测试中考虑正则表达式编译时间,或者正在测试缓存功能本身,请使用它.调用Python标准库中的唯一位置re.purge()
是在测试中(特别test_re
是在re
模块的单元测试和回归测试套件中的参考泄漏测试中).
如果您的代码正在创建许多您打算继续使用的正则表达式对象,那么最好使用re.compile()
并保留对这些已编译表达式对象的引用.查看re.compile()
文档:
序列
Run Code Online (Sandbox Code Playgroud)prog = re.compile(pattern) result = prog.match(string)
相当于
Run Code Online (Sandbox Code Playgroud)result = re.match(pattern, string)
但是
re.compile()
,当在单个程序中多次使用表达式时,使用和保存生成的正则表达式对象以便重用会更有效.注意:传递给最新模式的编译版本
re.compile()
和模块级匹配函数被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式.