summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/collections.py13
-rw-r--r--Lib/functools.py3
2 files changed, 14 insertions, 2 deletions
diff --git a/Lib/collections.py b/Lib/collections.py
index 1a43afb..6daa596 100644
--- a/Lib/collections.py
+++ b/Lib/collections.py
@@ -161,6 +161,19 @@ class OrderedDict(dict, MutableMapping):
def __del__(self):
self.clear() # eliminate cyclical references
+ def _move_to_end(self, key, PREV=0, NEXT=1):
+ 'Fast version of self[key]=self.pop(key). Private method for internal use.'
+ link = self.__map[key]
+ link_prev = link[PREV]
+ link_next = link[NEXT]
+ link_prev[NEXT] = link_next
+ link_next[PREV] = link_prev
+ root = self.__root
+ last = root[PREV]
+ link[PREV] = last
+ link[NEXT] = root
+ last[NEXT] = root[PREV] = link
+
################################################################################
### namedtuple
diff --git a/Lib/functools.py b/Lib/functools.py
index 1bbc520..f9e35d8 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -139,8 +139,7 @@ def lru_cache(maxsize=100):
try:
with lock:
result = cache[key]
- del cache[key]
- cache[key] = result # record recent use of this key
+ cache._move_to_end(key) # record recent use of this key
wrapper.hits += 1
except KeyError:
result = user_function(*args, **kwds)