From 1ae431146db5b63c6de2a95bf07e7f76dad1e4ce Mon Sep 17 00:00:00 2001 From: SEMAEROL <123257636+SEMAEROL@users.noreply.github.com> Date: Tue, 31 Mar 2026 13:25:59 +0300 Subject: [PATCH 1/2] Add performance decorator for function metrics --- Week04/decorators_sema_erol.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Week04/decorators_sema_erol.py diff --git a/Week04/decorators_sema_erol.py b/Week04/decorators_sema_erol.py new file mode 100644 index 00000000..95612d24 --- /dev/null +++ b/Week04/decorators_sema_erol.py @@ -0,0 +1,33 @@ +import time +import tracemalloc +import functools + +def performance(func): + """Decorator that measures performance and saves statistics.""" + + @functools.wraps(func) + def wrapper(*args, **kwargs): + # Counter + wrapper.counter += 1 + + # Memory tracking + tracemalloc.start() + + # Time tracking + start = time.perf_counter() + result = func(*args, **kwargs) + end = time.perf_counter() + + _, peak_mem = tracemalloc.get_traced_memory() + tracemalloc.stop() + + wrapper.total_time += (end - start) + wrapper.total_mem += peak_mem + + return result + + wrapper.counter = 0 + wrapper.total_time = 0.0 + wrapper.total_mem = 0 + + return wrapper From 8be389fb749049f2549c2111189fa3688fd526ac Mon Sep 17 00:00:00 2001 From: SEMAEROL <123257636+SEMAEROL@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:15:10 +0300 Subject: [PATCH 2/2] Refactor performance decorator for better tracking Refactor performance decorator to track execution time and memory usage more efficiently. --- Week04/decorators_sema_erol.py | 45 +++++++++++++--------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/Week04/decorators_sema_erol.py b/Week04/decorators_sema_erol.py index 95612d24..c7603b77 100644 --- a/Week04/decorators_sema_erol.py +++ b/Week04/decorators_sema_erol.py @@ -1,33 +1,22 @@ -import time import tracemalloc -import functools +import time + def performance(func): - """Decorator that measures performance and saves statistics.""" - - @functools.wraps(func) - def wrapper(*args, **kwargs): - # Counter - wrapper.counter += 1 - - # Memory tracking - tracemalloc.start() - - # Time tracking - start = time.perf_counter() + if not hasattr(performance,'counter'): + performance.counter = 0 + performance.total_time = 0 + performance.total_mem = 0 + + def perform(*args,**kwargs): + tracemalloc.start() # start to follow memory + start_time = time.time() result = func(*args, **kwargs) - end = time.perf_counter() - - _, peak_mem = tracemalloc.get_traced_memory() - tracemalloc.stop() - - wrapper.total_time += (end - start) - wrapper.total_mem += peak_mem - + end_time = time.time() + used_memory = tracemalloc.get_traced_memory()[1] # [0] gives current memory consumption but [1] gives total(max) memory consumption during thr last fallowing time + tracemalloc.stop() # we started memeory following process only to find how much memory uses by thr called function not the entire program ,so we stop memory following when the jop of function is finished + performance.counter += 1 + performance.total_time += end_time - start_time + performance.total_mem += used_memory return result - - wrapper.counter = 0 - wrapper.total_time = 0.0 - wrapper.total_mem = 0 - - return wrapper + return perform