@@ -59,6 +59,10 @@ def __init__(self, mapping=None, capacity=None, expires_in=None, lock=None,
5959 self ._expires_in = expires_in
6060 self ._lock = Lock () if lock is None else lock
6161
62+ def _peek (self ):
63+ # Returns (sequence, timestamps) without triggering maintenance
64+ return self ._mapping .get (self ._INDEX , ([], {}))
65+
6266 def _validate_key (self , key ):
6367 if key == self ._INDEX :
6468 raise ValueError ("key {} is a reserved keyword in {}" .format (
@@ -85,7 +89,7 @@ def _set(self, key, value, expires_in):
8589 # This internal implementation powers both set() and __setitem__(),
8690 # so that they don't depend on each other.
8791 self ._validate_key (key )
88- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
92+ sequence , timestamps = self ._peek ( )
8993 self ._maintenance (sequence , timestamps ) # O(logN)
9094 now = int (time .time ())
9195 expires_at = now + expires_in
@@ -136,7 +140,7 @@ def __getitem__(self, key): # O(1)
136140 self ._validate_key (key )
137141 with self ._lock :
138142 # Skip self._maintenance(), because it would need O(logN) time
139- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
143+ sequence , timestamps = self ._peek ( )
140144 expires_at , created_at = timestamps [key ] # Would raise KeyError accordingly
141145 now = int (time .time ())
142146 if not created_at <= now < expires_at :
@@ -155,22 +159,22 @@ def __delitem__(self, key): # O(1)
155159 with self ._lock :
156160 # Skip self._maintenance(), because it would need O(logN) time
157161 self ._mapping .pop (key , None ) # O(1)
158- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
162+ sequence , timestamps = self ._peek ( )
159163 del timestamps [key ] # O(1)
160164 self ._mapping [self ._INDEX ] = sequence , timestamps
161165
162166 def __len__ (self ): # O(logN)
163167 """Drop all expired items and return the remaining length"""
164168 with self ._lock :
165- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
169+ sequence , timestamps = self ._peek ( )
166170 self ._maintenance (sequence , timestamps ) # O(logN)
167171 self ._mapping [self ._INDEX ] = sequence , timestamps
168172 return len (timestamps ) # Faster than iter(self._mapping) when it is on disk
169173
170174 def __iter__ (self ):
171175 """Drop all expired items and return an iterator of the remaining items"""
172176 with self ._lock :
173- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
177+ sequence , timestamps = self ._peek ( )
174178 self ._maintenance (sequence , timestamps ) # O(logN)
175179 self ._mapping [self ._INDEX ] = sequence , timestamps
176180 return iter (timestamps ) # Faster than iter(self._mapping) when it is on disk
0 commit comments