__author__ = "Christian Heider Lindbjerg"
__doc__ = r"""
Automatically generates a look up data
Created on 06/03/2020
"""
import logging
from time import sleep, time
from typing import Any, Callable, Iterable, Mapping, MutableMapping, Sequence, Set, Tuple
from warg.decorators.hashing import make_hash
_logger = logging.getLogger(__name__)
global_table = {}
__all__ = ["add_lut", "look_up", "look_up_args", "look_up_kws"]
[docs]
def add_lut(f: Callable) -> callable:
"""
:param f:
:type f:
:return:
:rtype:"""
global_table[f] = {}
return f
[docs]
def look_up(f: Callable, *args: Sequence[Any], **kwargs: MutableMapping[str, Any]) -> Any:
"""
:param f:
:type f:
:param args:
:type args:
:param kwargs:
:type kwargs:
:return:
:rtype:"""
ag_hash = hash(args) + make_hash(kwargs)
if f in global_table:
if ag_hash in global_table[f]:
return global_table[f][ag_hash]
res = global_table[f][ag_hash] = f(*args, **kwargs)
return res
global_table[f] = {}
res = global_table[f][ag_hash] = f(*args, **kwargs)
return res
[docs]
def look_up_args(f: Callable, *args: Sequence) -> Any:
"""
:param f:
:type f:
:param args:
:type args:
:return:
:rtype:"""
if f in global_table:
if args in global_table[f]:
return global_table[f][args]
res = global_table[f][args] = f(*args)
return res
global_table[f] = {}
res = global_table[f][args] = f(*args)
return res
[docs]
def look_up_kws(f: Callable, **kwargs: MutableMapping) -> Any:
"""
:param f:
:type f:
:param kws:
:type kws:
:return:
:rtype:"""
kw_hash = make_hash(kwargs)
if f in global_table:
if kw_hash in global_table[f]:
return global_table[f][kw_hash]
res = global_table[f][kw_hash] = f(**kwargs)
return res
global_table[f] = {}
res = global_table[f][kw_hash] = f(**kwargs)
return res
def precompute_lut(f: Callable, arg_sets: Set[Tuple[Iterable, Mapping]], *, verbose=False) -> callable:
"""
:param f:
:type f:
:param arg_sets:
:type arg_sets:
:param verbose:
:type verbose:
:return:
:rtype:"""
for arg_set, kws_set in arg_sets:
res = look_up(f, *arg_set, **kws_set)
if verbose:
_logger.info(f"precompute {f},{arg_set},{kws_set}->{res}")
return f
def precompute_lut_args(f: Callable, arg_sets: Set[Iterable], *, verbose=False) -> callable:
"""
:param f:
:type f:
:param arg_sets:
:type arg_sets:
:param verbose:
:type verbose:
:return:
:rtype:"""
for arg_set in arg_sets:
res = look_up_args(f, *arg_set)
if verbose:
_logger.info(f"precompute {f},{arg_sets}->{res}")
return f
def precompute_lut_kws(f: Callable, arg_sets: Set[Mapping], *, verbose=False) -> callable:
"""
:param f:
:type f:
:param arg_sets:
:type arg_sets:
:param verbose:
:type verbose:
:return:
:rtype:"""
for arg_set in arg_sets:
res = look_up_kws(f, **arg_set)
if verbose:
_logger.info(f"precompute {f},{arg_sets}->{res}")
return f
def precompute_lut_dec(arg_sets, *, verbose=False):
"""
:param arg_sets:
:type arg_sets:
:param verbose:
:type verbose:
:return:
:rtype:"""
def rdec(f):
"""
:param f:
:type f:
:return:
:rtype:"""
precompute_lut(f, arg_sets, verbose=verbose)
return f
return rdec
def precompute_lut_args_dec(arg_sets, *, verbose: bool = False):
"""
:param arg_sets:
:type arg_sets:
:param verbose:
:type verbose:
:return:
:rtype:"""
def rdec(f):
"""
:param f:
:type f:
:return:
:rtype:"""
precompute_lut_args(f, arg_sets, verbose=verbose)
return f
return rdec
if __name__ == "__main__":
@add_lut
def my_function(foo, bar):
"""
:param foo:
:type foo:
:param bar:
:type bar:
:return:
:rtype:"""
return foo + bar
result = look_up_args(my_function, 0, 8)
_logger.info(result)
result = look_up_args(my_function, 8, 0)
_logger.info(result)
@precompute_lut_args_dec(list(zip(range(9), list(range(9))[::-1])))
def my_function2(foo, bar):
"""
:param foo:
:type foo:
:param bar:
:type bar:
:return:
:rtype:"""
sleep(0.1)
return bar * foo
a = time()
look_up_args(my_function2, 0, 8)
_logger.info(time() - a)
a = time()
look_up_args(my_function2, 8, 0)
_logger.info(time() - a)
result = look_up(my_function2, 14, bar=21)
_logger.info(result)
result = look_up(my_function2, 14, bar=21)
_logger.info(result)
result = look_up(my_function2, 104, bar=2)
_logger.info(result)
result = look_up_args(my_function, 1, 2)
_logger.info(result)
result = look_up_args(my_function, 1, 2)
_logger.info(result)
result = look_up_args(my_function, 12, 2)
_logger.info(result)
result = look_up_args(my_function2, 1, 2)
_logger.info(result)
result = look_up_kws(my_function2, foo=1, bar=2)
_logger.info(result)