mirror of
https://github.com/python/cpython
synced 2024-10-14 13:18:08 +00:00
No need to create and destroy links when updating a fixed-sized circular queue.
This commit is contained in:
parent
3288e948f3
commit
41eb79a016
|
@ -219,7 +219,7 @@ def wrapper(*args, **kwds):
|
|||
|
||||
def wrapper(*args, **kwds):
|
||||
# size limited caching that tracks accesses by recency
|
||||
nonlocal hits, misses
|
||||
nonlocal root, hits, misses
|
||||
key = make_key(args, kwds, typed) if kwds or typed else args
|
||||
with lock:
|
||||
link = cache_get(key)
|
||||
|
@ -236,16 +236,21 @@ def wrapper(*args, **kwds):
|
|||
return result
|
||||
result = user_function(*args, **kwds)
|
||||
with lock:
|
||||
# put result in a new link at the front of the list
|
||||
last = root[PREV]
|
||||
link = [last, root, key, result]
|
||||
cache[key] = last[NEXT] = root[PREV] = link
|
||||
if _len(cache) > maxsize:
|
||||
# purge the least recently used cache entry
|
||||
old_prev, old_next, old_key, old_result = root[NEXT]
|
||||
root[NEXT] = old_next
|
||||
old_next[PREV] = root
|
||||
del cache[old_key]
|
||||
if _len(cache) < maxsize:
|
||||
# put result in a new link at the front of the list
|
||||
last = root[PREV]
|
||||
link = [last, root, key, result]
|
||||
cache[key] = last[NEXT] = root[PREV] = link
|
||||
else:
|
||||
# use root to store the new key and result
|
||||
root[KEY] = key
|
||||
root[RESULT] = result
|
||||
cache[key] = root
|
||||
# empty the oldest link and make it the new root
|
||||
root = root[NEXT]
|
||||
del cache[root[KEY]]
|
||||
root[KEY] = None
|
||||
root[RESULT] = None
|
||||
misses += 1
|
||||
return result
|
||||
|
||||
|
|
Loading…
Reference in a new issue