from functools import wraps
from time import time

def timed_function(func):
    """
    Very simple profiling decorator for debugging.
    Usage:
        @timed_function
        def my_func():
            ...
    
    More advanced alternatives:
        - viztracer ../.venv/bin/archivebox manage check          # https://viztracer.readthedocs.io/en/latest/filter.html
        - python -m cProfile -o archivebox.prof ../.venv/bin/archivebox manage check; snakeviz archivebox.prof
        - Django Debug Toolbar + django-debug-toolbar-flamegraph
        + Django Requests Tracker (requests-tracker)
    """
    @wraps(func)
    def wrap(*args, **kwargs):
        if args and hasattr(args[0], '__module__'):
            module = args[0].__module__
        else:
            module = func.__module__
        ts_start = time()
        result = func(*args, **kwargs)
        ts_end = time()
        ms_elapsed = int((ts_end-ts_start) * 1000)
        print(f'[DEBUG][{ms_elapsed}ms] {module}.{func.__name__}(...)')
        return result
    return wrap