在Python中使用re
时清除缓存的重要性是什么。
它对性能或内存管理有帮助吗?如果我们忽略它会发生什么。 re.purge()
应该在哪里打电话?
答案 0 :(得分:5)
大多数代码无需担心清除re
模块缓存。它带来的内存好处很小,如果清除它,实际上可能会损害性能。
当您直接使用顶级re.*
函数而不是使用re.compile(pattern)
时,缓存用于存储compiled regular expression objects。例如,如果您在循环中使用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()
documentation:
序列
prog = re.compile(pattern) result = prog.match(string)
等同于
result = re.match(pattern, string)
但是,如果在单个程序中多次使用该表达式,则使用
re.compile()
并保存生成的正则表达式对象以供重用会更有效。注意:缓存了传递给
re.compile()
的最新模式的编译版本以及模块级匹配函数,因此程序一次只使用几个正则表达式的程序就被缓存了。不必担心编译正则表达式。