70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
import time
|
|
from functools import wraps
|
|
|
|
|
|
class Timer:
|
|
def __init__(
|
|
self,
|
|
prefix: str = "Start at {start_time}",
|
|
postfix: str = "End at {end_time}, took {duration} seconds.",
|
|
):
|
|
self.prefix = prefix
|
|
self.format = format
|
|
self.postfix = postfix
|
|
|
|
def __call__(
|
|
self,
|
|
func,
|
|
):
|
|
@wraps(func)
|
|
async def wrapper(*args, **kwargs):
|
|
start_time = time.time()
|
|
prefix = self.prefix.replace("{start_time}", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(start_time)))
|
|
print(prefix)
|
|
|
|
result = await func(*args, **kwargs)
|
|
|
|
end_time = time.time()
|
|
duration = end_time - start_time
|
|
postfix = self.postfix.replace("{end_time}", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))).replace("{duration}", f"{duration:.2f}")
|
|
print(postfix)
|
|
|
|
return result
|
|
|
|
return wrapper
|
|
|
|
|
|
def __enter__(self):
|
|
self.start_time = time.time()
|
|
prefix = self.prefix.replace("{start_time}", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.start_time)))
|
|
print(prefix)
|
|
return self
|
|
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
if exc_type is not None:
|
|
return False
|
|
|
|
end_time = time.time()
|
|
duration = end_time - self.start_time
|
|
postfix = self.postfix.replace("{end_time}", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))).replace("{duration}", f"{duration:.2f}")
|
|
print(postfix)
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
with Timer(
|
|
prefix="Begin timing at {start_time}",
|
|
postfix="Finished at {end_time}",
|
|
):
|
|
time.sleep(1)
|
|
|
|
|
|
@Timer()
|
|
def test_sleep():
|
|
time.sleep(1)
|
|
|
|
test_sleep() |