123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- import os
- import atexit
- if "MUMLE_PROFILER" in os.environ:
- import time
- timings = {}
- class Timer:
- def __init__(self, text):
- self.text = text
- def __enter__(self):
- self.start_time = time.perf_counter_ns()
- def __exit__(self, exc_type, exc_value, traceback):
- self.end_time = time.perf_counter_ns()
- duration = self.end_time - self.start_time
- existing_timing, count = timings.get(self.text, (0, 0))
- timings[self.text] = (existing_timing + duration, count+1)
- def __print_timings():
- if len(timings)>0:
- print(f'Timings:')
- tuples = [(text,(duration,count)) for text, (duration, count) in timings.items()]
- tuples.sort(key=lambda tup: -tup[1][0])
- for text, (duration, count) in tuples:
- print(f' {text} {round(duration/1000000)} ms ({count} times, {round(duration/count/1000000)} ms avg.)')
- atexit.register(__print_timings)
- else:
- class Timer:
- def __init__(self, text):
- pass
- def __enter__(self):
- pass
- def __exit__(self, exc_type, exc_value, traceback):
- pass
- def counted(f):
- def wrapped(*args, **kwargs):
- wrapped.calls += 1
- return f(*args, **kwargs)
- wrapped.calls = 0
- def ccc():
- print(f'{f} was called {wrapped.calls} times')
- atexit.register(ccc)
- return wrapped
|