209 for i, v in enumerate(self): |
209 for i, v in enumerate(self): |
210 if v == val: |
210 if v == val: |
211 del self[i] |
211 del self[i] |
212 break |
212 break |
213 |
213 |
|
214 class lrucachedict(object): |
|
215 '''cache most recent gets from or sets to this dictionary''' |
|
216 def __init__(self, maxsize): |
|
217 self._cache = {} |
|
218 self._maxsize = maxsize |
|
219 self._order = deque() |
|
220 |
|
221 def __getitem__(self, key): |
|
222 value = self._cache[key] |
|
223 self._order.remove(key) |
|
224 self._order.append(key) |
|
225 return value |
|
226 |
|
227 def __setitem__(self, key, value): |
|
228 if key not in self._cache: |
|
229 if len(self._cache) >= self._maxsize: |
|
230 del self._cache[self._order.popleft()] |
|
231 else: |
|
232 self._order.remove(key) |
|
233 self._cache[key] = value |
|
234 self._order.append(key) |
|
235 |
|
236 def __contains__(self, key): |
|
237 return key in self._cache |
|
238 |
214 def lrucachefunc(func): |
239 def lrucachefunc(func): |
215 '''cache most recent results of function calls''' |
240 '''cache most recent results of function calls''' |
216 cache = {} |
241 cache = {} |
217 order = deque() |
242 order = deque() |
218 if func.func_code.co_argcount == 1: |
243 if func.func_code.co_argcount == 1: |