Source code for ewoksid14.timepix4.t4_profile

import functools
import os
import time
import tracemalloc
from contextlib import ExitStack
from contextlib import contextmanager
from datetime import timedelta
from typing import List
from typing import Union

import numpy
from memory_profiler import profile as mem_line_profile  # noqa F401


[docs] def main_profile(mem=True, time=True): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): with ExitStack() as stack: if mem: stack.enter_context(mem_context()) if time: stack.enter_context(time_context()) return func(*args, **kwargs) return wrapper return decorator
[docs] @contextmanager def mem_context(): tracemalloc.start() try: yield finally: current, peak = tracemalloc.get_traced_memory() print(f"Current memory usage: {_format_bytes(current)}") print(f"Peak memory usage: {_format_bytes(peak)}")
[docs] @contextmanager def time_context(): t0 = time.time() try: yield finally: duration = int(time.time() - t0) print(f"\nDuration: {timedelta(seconds=duration)}")
def _format_bytes(num_bytes: int) -> str: """ Convert a byte value into a human-readable string with automatically selected unit. """ units = ["B", "KiB", "MiB", "GiB", "TiB", "PiB"] value = float(num_bytes) for unit in units: if value < 1024 or unit == units[-1]: return f"{value:.2f} {unit}" value /= 1024