[Python-checkins] bpo-28293: Don't completely dump the regex cache when full. (#3768)

Serhiy Storchaka webhook-mailer at python.org
Tue Sep 26 12:47:39 EDT 2017


https://github.com/python/cpython/commit/114454e9f6addbcb364e9a37102c8131ae2da1dd
commit: 114454e9f6addbcb364e9a37102c8131ae2da1dd
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2017年09月26日T19:47:36+03:00
summary:
bpo-28293: Don't completely dump the regex cache when full. (#3768)
files:
A Misc/NEWS.d/next/Library/2017-09-26-17-51-17.bpo-28293.UC5pm4.rst
M Lib/re.py
diff --git a/Lib/re.py b/Lib/re.py
index d0ee5db175b..657a4f6721e 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -128,6 +128,13 @@
 except ImportError:
 _locale = None
 
+# try _collections first to reduce startup cost
+try:
+ from _collections import OrderedDict
+except ImportError:
+ from collections import OrderedDict
+
+
 # public symbols
 __all__ = [
 "match", "fullmatch", "search", "sub", "subn", "split",
@@ -260,7 +267,7 @@ def escape(pattern):
 # --------------------------------------------------------------------
 # internals
 
-_cache = {}
+_cache = OrderedDict()
 
 _pattern_type = type(sre_compile.compile("", 0))
 
@@ -281,7 +288,10 @@ def _compile(pattern, flags):
 p = sre_compile.compile(pattern, flags)
 if not (flags & DEBUG):
 if len(_cache) >= _MAXCACHE:
- _cache.clear()
+ try:
+ _cache.popitem(False)
+ except KeyError:
+ pass
 _cache[type(pattern), pattern, flags] = p
 return p
 
diff --git a/Misc/NEWS.d/next/Library/2017-09-26-17-51-17.bpo-28293.UC5pm4.rst b/Misc/NEWS.d/next/Library/2017-09-26-17-51-17.bpo-28293.UC5pm4.rst
new file mode 100644
index 00000000000..16b92b05dbf
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2017-09-26-17-51-17.bpo-28293.UC5pm4.rst
@@ -0,0 +1 @@
+The regular expression cache is no longer completely dumped when it is full.


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /