diff options
author | ptmcg <ptmcg@austin.rr.com> | 2022-06-18 00:09:44 -0500 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2022-06-18 00:09:44 -0500 |
commit | 3394e81df2c8cb4b1449834c9367d5f7cf6a819f (patch) | |
tree | 1f56421aee0ca3f4973b14fcc438f6fd2756d243 | |
parent | 4881e6231a1a0d820195a8628d0b3e705fdabb3b (diff) | |
download | pyparsing-git-3394e81df2c8cb4b1449834c9367d5f7cf6a819f.tar.gz |
Replace OrderedDict in FIFOCache with dict+key ringbuffer
-rw-r--r-- | pyparsing/util.py | 11 |
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) |