Source code for sensai.util.profiling
import functools
import logging
from typing import Optional, Callable
from time import time
log = logging.getLogger(__name__)
[docs]def profiled(func: Optional[Callable] = None, *, sampling_interval_seconds: Optional[float] = None,
print_to_console=True, log_to_file=False, file_name: Optional[str] = None):
"""
Function decorator for profiling the annotated/given function with the pyinstrument profiler
:param func: the function to be profiled
:param sampling_interval_seconds: sampling every <sampling_interval_seconds> seconds, if None use default parameter of pyinstrument
profiler
:param print_to_console: if, true print profiler output to console
:param log_to_file: if true, logs profiler output to html file
:param file_name: optional file name for log, if None defaults to file name derived from function name
:return: the wrapped function
"""
from pyinstrument import Profiler
def wrapper(_func):
@functools.wraps(_func)
def _wrapper(*args, **kwargs):
_profiler = Profiler(sampling_interval_seconds) if sampling_interval_seconds is not None else Profiler()
_profiler.start()
result = _func(*args, **kwargs)
_profiler.stop()
if print_to_console:
print(_profiler.output_text(unicode=True, color=True))
if log_to_file:
name = file_name if file_name is not None else _func.__name__ + ".profile"
with open(f"{name}.html", "w") as f:
f.write(_profiler.output_html())
return result
return _wrapper
if func:
return wrapper(func)
return wrapper
[docs]def timed(func):
"""
Function decorator which logs execution times of the wrapped/annotated function at INFO level
:param func: the function whose execution time to log
:return: the wrapped function
"""
@functools.wraps(func)
def _wrapper(*args, **kwargs):
start = int(round(time() * 1000))
try:
return func(*args, **kwargs)
finally:
end_ = int(round(time() * 1000)) - start
log.info(f"Execution time of {func.__qualname__}: {end_ if end_ > 0 else 0} ms")
return _wrapper