equal
deleted
inserted
replaced
1462 |
1462 |
1463 def _enforcecostlimit(self): |
1463 def _enforcecostlimit(self): |
1464 # This should run after an insertion. It should only be called if total |
1464 # This should run after an insertion. It should only be called if total |
1465 # cost limits are being enforced. |
1465 # cost limits are being enforced. |
1466 # The most recently inserted node is never evicted. |
1466 # The most recently inserted node is never evicted. |
|
1467 if len(self) <= 1 or self.totalcost <= self.maxcost: |
|
1468 return |
|
1469 |
|
1470 # This is logically equivalent to calling popoldest() until we |
|
1471 # free up enough cost. We don't do that since popoldest() needs |
|
1472 # to walk the linked list and doing this in a loop would be |
|
1473 # quadratic. So we find the first non-empty node and then |
|
1474 # walk nodes until we free up enough capacity. |
|
1475 n = self._head.prev |
|
1476 while n.key is _notset: |
|
1477 n = n.prev |
|
1478 |
1467 while len(self) > 1 and self.totalcost > self.maxcost: |
1479 while len(self) > 1 and self.totalcost > self.maxcost: |
1468 self.popoldest() |
1480 del self._cache[n.key] |
|
1481 self.totalcost -= n.cost |
|
1482 n.markempty() |
|
1483 n = n.prev |
1469 |
1484 |
1470 def lrucachefunc(func): |
1485 def lrucachefunc(func): |
1471 '''cache most recent results of function calls''' |
1486 '''cache most recent results of function calls''' |
1472 cache = {} |
1487 cache = {} |
1473 order = collections.deque() |
1488 order = collections.deque() |