summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2022-06-18 00:09:44 -0500
committerptmcg <ptmcg@austin.rr.com>2022-06-18 00:09:44 -0500
commit3394e81df2c8cb4b1449834c9367d5f7cf6a819f (patch)
tree1f56421aee0ca3f4973b14fcc438f6fd2756d243
parent4881e6231a1a0d820195a8628d0b3e705fdabb3b (diff)
downloadpyparsing-git-3394e81df2c8cb4b1449834c9367d5f7cf6a819f.tar.gz
Replace OrderedDict in FIFOCache with dict+key ringbuffer
-rw-r--r--pyparsing/util.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/pyparsing/util.py b/pyparsing/util.py
index cdd1e90..b3db48a 100644
--- a/pyparsing/util.py
+++ b/pyparsing/util.py
@@ -100,19 +100,24 @@ class _UnboundedCache:
class _FifoCache:
def __init__(self, size):
self.not_in_cache = not_in_cache = object()
- cache = collections.OrderedDict()
+ cache = {}
+ keyring = [object()] * size
cache_get = cache.get
+ cache_pop = cache.pop
+ keyiter = itertools.cycle(range(size))
def get(_, key):
return cache_get(key, not_in_cache)
def set_(_, key, value):
cache[key] = value
- while len(cache) > size:
- cache.popitem(last=False)
+ i = next(keyiter)
+ cache_pop(keyring[i], None)
+ keyring[i] = key
def clear(_):
cache.clear()
+ keyring[:] = [object()] * size
self.size = size
self.get = types.MethodType(get, self)