summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-09-26 16:47:36 (GMT)
committerGitHub <noreply@github.com>2017-09-26 16:47:36 (GMT)
commit114454e9f6addbcb364e9a37102c8131ae2da1dd (patch)
treef356c57b2a928ac2e581c0b18f0ab8c8e16cdc3e
parent0e950dd22b075b4809c84afda8aede02b76ac0fa (diff)
downloadcpython-114454e9f6addbcb364e9a37102c8131ae2da1dd.zip
cpython-114454e9f6addbcb364e9a37102c8131ae2da1dd.tar.gz
cpython-114454e9f6addbcb364e9a37102c8131ae2da1dd.tar.bz2
bpo-28293: Don't completely dump the regex cache when full. (#3768)
-rw-r--r--Lib/re.py14
-rw-r--r--Misc/NEWS.d/next/Library/2017-09-26-17-51-17.bpo-28293.UC5pm4.rst1
2 files changed, 13 insertions, 2 deletions
diff --git a/Lib/re.py b/Lib/re.py
index d0ee5db..657a4f6 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -128,6 +128,13 @@ try:
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 0000000..16b92b0
--- /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.