def func_wrapper(func): cfunc = fastcache.clru_cache(maxsize, typed=True, unhashable='ignore')(func) CACHE.append(cfunc) return cfunc
def cache_wrapper(func): from fastcache import clru_cache cached_func = clru_cache(maxsize, typed, state, unhashable)(func) def inner(*args, **kwargs): if not o.has_refreshed and is_expired(): cached_func.cache_clear() o.has_refreshed = True return cached_func(*args, **kwargs) return inner
def test_lru(self): def orig(x, y): return 3 * x + y f = fastcache.clru_cache(maxsize=20)(orig) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(maxsize, 20) self.assertEqual(currsize, 0) self.assertEqual(hits, 0) self.assertEqual(misses, 0) domain = range(5) for i in range(1000): x, y = choice(domain), choice(domain) actual = f(x, y) expected = orig(x, y) self.assertEqual(actual, expected) hits, misses, maxsize, currsize = f.cache_info() self.assertTrue(hits > misses) self.assertEqual(hits + misses, 1000) self.assertEqual(currsize, 20) f.cache_clear() # test clearing hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 0) self.assertEqual(currsize, 0) f(x, y) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # Test bypassing the cache if hasattr(self, 'assertIs'): self.assertIs(f.__wrapped__, orig) f.__wrapped__(x, y) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # test size zero (which means "never-cache") @fastcache.clru_cache(0) def f(): #nonlocal f_cnt f_cnt[0] += 1 return 20 self.assertEqual(f.cache_info().maxsize, 0) f_cnt = [0] for i in range(5): self.assertEqual(f(), 20) self.assertEqual(f_cnt, [5]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 5) self.assertEqual(currsize, 0) # test size one @fastcache.clru_cache(1) def f(): #nonlocal f_cnt f_cnt[0] += 1 return 20 self.assertEqual(f.cache_info().maxsize, 1) f_cnt[0] = 0 for i in range(5): self.assertEqual(f(), 20) self.assertEqual(f_cnt, [1]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 4) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # test size two @fastcache.clru_cache(2) def f(x): #nonlocal f_cnt f_cnt[0] += 1 return x * 10 self.assertEqual(f.cache_info().maxsize, 2) f_cnt[0] = 0 for x in 7, 9, 7, 9, 7, 9, 8, 8, 8, 9, 9, 9, 8, 8, 8, 7: # * * * * self.assertEqual(f(x), x * 10) self.assertEqual(f_cnt, [4]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 12) self.assertEqual(misses, 4) self.assertEqual(currsize, 2)
def cache(max_size=4096): return fastcache.clru_cache(maxsize=max_size)
if s: out.append(new_lhs[0]) new_lhs = new_lhs[1:] else: out.append(new_rhs[0]) new_rhs = new_rhs[1:] assert not new_rhs assert not new_lhs return out return lhs, rhs, merge def cache(max_size=4096): return fastcache.clru_cache(maxsize=max_size) memoize = fastcache.clru_cache(maxsize=None) def prod(xs): out = 1 for x in xs: out *= x return out class WrapHashably(object): __slots__ = ["val"] def __init__(self, val): self.val = val def __hash__(self): return id(self.val)
_simple_email_re, _word_split_re, escape, text_type, ) import util def _get_stringy_set(seq, charset, errors): if isinstance(seq, text_type): seq = seq.encode(charset, errors) return bytearray(seq) _cached_get_stringy_set = fastcache.clru_cache()(_get_stringy_set) def _upstream_transform(string, safe): rv = bytearray() for char in bytearray(string): if char in safe: rv.append(char) else: rv.extend(('%%%02X' % char).encode('ascii')) return rv def _chunking_transform(string, safe):
if sys.version_info[:2] >= (3, 3): import functools import fastcache import timeit from itertools import count def _untyped(*args, **kwargs): pass def _typed(*args, **kwargs): pass _py_untyped = functools.lru_cache(maxsize=100)(_untyped) _c_untyped = fastcache.clru_cache(maxsize=100)(_untyped) _py_typed = functools.lru_cache(maxsize=100, typed=True)(_typed) _c_typed = fastcache.clru_cache(maxsize=100, typed=True)(_typed) def _arg_gen(min=1, max=100, repeat=3): for i in range(min, max): for r in range(repeat): for j, k in zip(range(i), count(i, -1)): yield j, k def _print_speedup(results): print('') print('{:9s} {:>6s} {:>6s} {:>6s}'.format('','min', 'mean', 'max')) def print_stats(name,off0, off1): arr = [py[0]/c[0] for py, c in zip(results[off0::4],
def lru_wrap(func, cache_size=None): if cache_size: return clru_cache(maxsize=cache_size)(func) else: return func
def test_lru(self): def orig(x, y): return 3 * x + y f = fastcache.clru_cache(maxsize=20)(orig) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(maxsize, 20) self.assertEqual(currsize, 0) self.assertEqual(hits, 0) self.assertEqual(misses, 0) domain = range(5) for i in range(1000): x, y = choice(domain), choice(domain) actual = f(x, y) expected = orig(x, y) self.assertEqual(actual, expected) hits, misses, maxsize, currsize = f.cache_info() self.assertTrue(hits > misses) self.assertEqual(hits + misses, 1000) self.assertEqual(currsize, 20) f.cache_clear() # test clearing hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 0) self.assertEqual(currsize, 0) f(x, y) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # Test bypassing the cache if hasattr(self, 'assertIs'): self.assertIs(f.__wrapped__, orig) f.__wrapped__(x, y) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # test size zero (which means "never-cache") @fastcache.clru_cache(0) def f(): #nonlocal f_cnt f_cnt[0] += 1 return 20 self.assertEqual(f.cache_info().maxsize, 0) f_cnt = [0] for i in range(5): self.assertEqual(f(), 20) self.assertEqual(f_cnt, [5]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 0) self.assertEqual(misses, 5) self.assertEqual(currsize, 0) # test size one @fastcache.clru_cache(1) def f(): #nonlocal f_cnt f_cnt[0] += 1 return 20 self.assertEqual(f.cache_info().maxsize, 1) f_cnt[0] = 0 for i in range(5): self.assertEqual(f(), 20) self.assertEqual(f_cnt, [1]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 4) self.assertEqual(misses, 1) self.assertEqual(currsize, 1) # test size two @fastcache.clru_cache(2) def f(x): #nonlocal f_cnt f_cnt[0] += 1 return x*10 self.assertEqual(f.cache_info().maxsize, 2) f_cnt[0] = 0 for x in 7, 9, 7, 9, 7, 9, 8, 8, 8, 9, 9, 9, 8, 8, 8, 7: # * * * * self.assertEqual(f(x), x*10) self.assertEqual(f_cnt, [4]) hits, misses, maxsize, currsize = f.cache_info() self.assertEqual(hits, 12) self.assertEqual(misses, 4) self.assertEqual(currsize, 2)
def __init__(self, condition_cb_pairs, neqsys_factory, **kwargs): super(ConditionalNeqSys, self).__init__(**kwargs) self.condition_cb_pairs = condition_cb_pairs self.neqsys_factory = clru_cache(LRU_CACHE_SIZE)(neqsys_factory)
def memoize(fun, max_size=4096): return fastcache.clru_cache(maxsize=max_size)(fun)
if sys.version_info[:2] >= (3, 3): import functools import fastcache import timeit from itertools import count def _untyped(*args, **kwargs): pass def _typed(*args, **kwargs): pass _py_untyped = functools.lru_cache(maxsize=100)(_untyped) _c_untyped = fastcache.clru_cache(maxsize=100)(_untyped) _py_typed = functools.lru_cache(maxsize=100, typed=True)(_typed) _c_typed = fastcache.clru_cache(maxsize=100, typed=True)(_typed) def _arg_gen(min=1, max=100, repeat=3): for i in range(min, max): for r in range(repeat): for j, k in zip(range(i), count(i, -1)): yield j, k def _print_speedup(results): print("") print("{:9s} {:>6s} {:>6s} {:>6s}".format("", "min", "mean", "max")) def print_stats(name, off0, off1):
_letters, _punctuation_re, _simple_email_re, _word_split_re, escape, text_type, ) import util def _get_stringy_set(seq, charset, errors): if isinstance(seq, text_type): seq = seq.encode(charset, errors) return bytearray(seq) _cached_get_stringy_set = fastcache.clru_cache()(_get_stringy_set) def _upstream_transform(string, safe): rv = bytearray() for char in bytearray(string): if char in safe: rv.append(char) else: rv.extend(('%%%02X' % char).encode('ascii')) return rv def _chunking_transform(string, safe): string_bytes = bytearray(string) safe_chars = [char in safe for char in string_bytes]