Skip to content

Instantly share code, notes, and snippets.

@Beandnot
Forked from midom/MidpointLruCache.py
Created May 16, 2020 03:07
Show Gist options
  • Select an option

  • Save Beandnot/af71c6f4896945d45b504cb94dd8140a to your computer and use it in GitHub Desktop.

Select an option

Save Beandnot/af71c6f4896945d45b504cb94dd8140a to your computer and use it in GitHub Desktop.

Revisions

  1. @midom midom created this gist May 8, 2013.
    32 changes: 32 additions & 0 deletions MidpointLruCache.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,32 @@
    class MidpointLruCache:
    def __init__(self, size, oldpercentage):
    self.size = size
    self.oldsize = size * oldpercentage / 100
    self.youngsize = size * (100 - oldpercentage) / 100

    self.youngitems = collections.OrderedDict()
    self.olditems = collections.OrderedDict()

    def __call__(self, func):
    def wrapper(arg):
    if arg in self.olditems:
    value = self.olditems[arg]
    del self.olditems[arg]
    self.olditems[arg] = value
    elif arg in self.youngitems:
    value = self.youngitems[arg]
    del self.youngitems[arg]
    self.olditems[arg] = value
    else:
    value = func(arg)
    self.youngitems[arg] = value

    if len(self.olditems) > self.oldsize:
    poparg,popvalue = self.olditems.popitem(False)
    self.youngitems[poparg] = popvalue

    while len(self.olditems)+len(self.youngitems) > self.size:
    self.youngitems.popitem(False)

    return value
    return wrapper