|
|
|
|
|
"""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)), |
|
) |
|
|