def test_is_arity(): assert is_arity(0, lambda: None) assert is_arity(1, lambda: None) is False assert is_arity(1, lambda x: None) assert is_arity(3, lambda x, y, z: None) assert is_arity(1, lambda x, *args: None) is False assert is_arity(1, lambda x, **kwargs: None) is False assert is_arity(1, all) assert is_arity(2, map) is False assert is_arity(2, range) is None
def test_introspect_curry_py3(): if not PY3: return f = toolz.curry(make_func('')) assert num_required_args(f) == 0 assert is_arity(0, f) assert has_varargs(f) is False assert has_keywords(f) is False f = toolz.curry(make_func('x')) assert num_required_args(f) == 0 assert is_arity(0, f) is False assert is_arity(1, f) is False assert has_varargs(f) is False assert has_keywords(f) # A side-effect of being curried f = toolz.curry(make_func('x, y, z=0')) assert num_required_args(f) == 0 assert is_arity(0, f) is False assert is_arity(1, f) is False assert is_arity(2, f) is False assert is_arity(3, f) is False assert has_varargs(f) is False assert has_keywords(f) f = toolz.curry(make_func('*args, **kwargs')) assert num_required_args(f) == 0 assert has_varargs(f) assert has_keywords(f)
def lrucache(func, size): """ A simple implementation of a least recently used (LRU) cache. Memoizes the recent calls of a computationally intensive function. Parameters ---------- func : function Must be unary (takes a single argument) size : int The size of the cache (number of previous calls to store) """ if size == 0: return func elif size < 0: raise ValueError("size argument must be a positive integer") # this only works for unary functions if not is_arity(1, func): raise ValueError("The function must be unary (take a single argument)") # initialize the cache cache = OrderedDict() def wrapper(x): if not (type(x) is np.ndarray): raise ValueError("Input must be an ndarray") # hash the input, using tostring for small and repr for large arrays if x.size <= 1e4: key = hash(x.tostring()) else: key = hash(repr(x)) # if the key is not in the cache, evalute the function if key not in cache: # clear space if necessary (keeps the most recent keys) if len(cache) >= size: cache.popitem(last=False) # store the new value in the cache cache[key] = func(x) return cache[key] return wrapper
def lrucache(func, size): """ A simple implementation of a least recently used (LRU) cache. Memoizes the recent calls of a computationally intensive function. Parameters ---------- func : function Must be unary (takes a single argument) size : int The size of the cache (number of previous calls to store) """ if size == 0: return func elif size < 0: raise ValueError("size argument must be a positive integer") # this only works for unary functions if not is_arity(1, func): raise ValueError("The function must be unary (take a single argument)") # initialize the cache cache = OrderedDict() def wrapper(x): if not(type(x) is np.ndarray): raise ValueError("Input must be an ndarray") # hash the input, using tostring for small and repr for large arrays if x.size <= 1e4: key = hash(x.tostring()) else: key = hash(repr(x)) # if the key is not in the cache, evalute the function if key not in cache: # clear space if necessary (keeps the most recent keys) if len(cache) >= size: cache.popitem(last=False) # store the new value in the cache cache[key] = func(x) return cache[key] return wrapper