import time import streamlit as st from os import environ class Timer(): total = 0 place_holder = None expander = None timer_list = [] def __init__(self, pt_name, en_name): self.pt_name = pt_name self.en_name = en_name if environ['PORTUGUESE'] == 'true': self.portuguese = True elif environ['PORTUGUESE'] == 'false': self.portuguese = False else: raise EnvironmentError if not Timer.place_holder: if self.portuguese: Timer.place_holder = st.empty() Timer.expander = Timer.place_holder.expander('Ver progresso') else: Timer.place_holder = st.empty() Timer.expander = Timer.place_holder.expander('See progress') self.display = Timer.expander.empty() Timer.timer_list.append(self) def __enter__(self): if self.portuguese: self.display.info(f'Executando "{self.pt_name}"...') else: self.display.info(f'Running "{self.en_name}"...') self.start_time = time.time() def __exit__(self, type, value, traceback): end_time = time.time() elapsed_time = end_time - self.start_time self.display.empty() if self.portuguese: Timer.expander.info(f'"{self.pt_name}" terminou em {elapsed_time:.2f} s') else: Timer.expander.info(f'"{self.en_name}" finished in {elapsed_time:.2f} s') # for manually starting the timer def start(self): if self.portuguese: self.display.warning(f'Executando "{self.pt_name}"...') else: self.display.warning(f'Running "{self.en_name}"...') self.start_time = time.time() # for manually stopping the timer def stop(self): end_time = time.time() elapsed_time = end_time - self.start_time Timer.total += elapsed_time self.display.empty() if self.portuguese: Timer.expander.warning(f'"{self.pt_name}" terminou em {elapsed_time:.2f} s') else: Timer.expander.warning(f'"{self.en_name}" finished in {elapsed_time:.2f} s') def reset(): Timer.total = 0 if Timer.place_holder: Timer.place_holder.empty() Timer.place_holder = None Timer.expander = None def show_total(): if environ['PORTUGUESE'] == 'true': Timer.expander.success(f'Tempo de execução total: {Timer.total:.2f} s') elif environ['PORTUGUESE'] == 'false': Timer.expander.success(f'Total elapsed time: {Timer.total:.2f} s') def time_it(pt_name, en_name): def decorator(func): def wrapper(*args, **kwargs): timer = Timer(pt_name, en_name) timer.start() result = func(*args, **kwargs) timer.stop() return result return wrapper return decorator