| |
| |
| """Function caching""" |
|
|
| import os |
| from joblib import Memory |
| from decorator import FunctionMaker |
|
|
|
|
| def _decorator_apply(dec, func): |
| return FunctionMaker.create( |
| func, |
| "return decfunc(%(shortsignature)s)", |
| dict(decfunc=dec(func)), |
| __wrapped__=func, |
| ) |
|
|
|
|
| class CacheManager(object): |
| """The librosa cache manager class wraps joblib.Memory |
| with a __call__ attribute, so that it may act as a function. |
| |
| Additionally, it provides a caching level filter, so that |
| different functions can be cached or not depending on the user's |
| preference for speed vs. storage usage. |
| """ |
|
|
| def __init__(self, *args, **kwargs): |
|
|
| level = kwargs.pop("level", 10) |
|
|
| |
| self.memory = Memory(*args, **kwargs) |
| |
| |
| self.level = level |
|
|
| def __call__(self, level): |
| """Example usage: |
| |
| @cache(level=2) |
| def semi_important_function(some_arguments): |
| ... |
| """ |
|
|
| def wrapper(function): |
| """Decorator function. Adds an input/output cache to |
| the specified function.""" |
| if self.memory.location is not None and self.level >= level: |
| return _decorator_apply(self.memory.cache, function) |
|
|
| else: |
| return function |
|
|
| return wrapper |
|
|
| def clear(self, *args, **kwargs): |
| return self.memory.clear(*args, **kwargs) |
|
|
| def eval(self, *args, **kwargs): |
| return self.memory.eval(*args, **kwargs) |
|
|
| def format(self, *args, **kwargs): |
| return self.memory.format(*args, **kwargs) |
|
|
| def reduce_size(self, *args, **kwargs): |
| return self.memory.reduce_size(*args, **kwargs) |
|
|
| def warn(self, *args, **kwargs): |
| return self.memory.warn(*args, **kwargs) |
|
|
|
|
| |
| cache = CacheManager( |
| os.environ.get("LIBROSA_CACHE_DIR", None), |
| mmap_mode=os.environ.get("LIBROSA_CACHE_MMAP", None), |
| compress=os.environ.get("LIBROSA_CACHE_COMPRESS", False), |
| verbose=int(os.environ.get("LIBROSA_CACHE_VERBOSE", 0)), |
| level=int(os.environ.get("LIBROSA_CACHE_LEVEL", 10)), |
| ) |
|
|