Skip to content

Instantly share code, notes, and snippets.

@cbpygit
Created May 11, 2020 17:16
Show Gist options
  • Save cbpygit/d64267ec7431f7b68196b565d52a7976 to your computer and use it in GitHub Desktop.
Save cbpygit/d64267ec7431f7b68196b565d52a7976 to your computer and use it in GitHub Desktop.
from cachetools import cached, LRUCache, Cache
from cachetools.keys import hashkey
from time import sleep
class LRUCacheEnsemble:
def __init__(self, maxsize_ensemble, maxsize_caches):
self.maxsize_ensemble = maxsize_ensemble
self.maxsize_caches = maxsize_caches
self.caches = LRUCache(maxsize=maxsize_ensemble)
def get_cache_from_ensemble(self, key1):
if not key1 in self.caches:
print(f'Creating LRUCache for key {key1}')
self.caches[key1] = LRUCache(self.maxsize_caches)
return self.caches[key1]
def __getitem__(self, keys, cache_getitem=Cache.__getitem__):
key1, key2 = keys
cache = self.get_cache_from_ensemble(key1)
return cache.__getitem__(key2, cache_getitem=cache_getitem)
def __setitem__(self, keys, value, cache_setitem=Cache.__setitem__):
key1, key2 = keys
cache = self.get_cache_from_ensemble(key1)
return cache.__setitem__(key2, value, cache_setitem=cache_setitem)
def __delitem__(self, keys, cache_delitem=Cache.__delitem__):
key1, key2 = keys
cache = self.get_cache_from_ensemble(key1)
return cache.__delitem__(key2, cache_delitem=cache_delitem)
@cached(LRUCacheEnsemble(maxsize_ensemble=20, maxsize_caches=30),
key=lambda *args: (hashkey(args[0]), hashkey(args[1:])))
def add_values(cage_id, a, b):
print('Sleeping...')
sleep(0.5)
return a+b
for repetitions in range(2):
for key1 in range(3):
for nums in range(3):
print(add_values(key1, nums, nums))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment