"""Tools related to timing functions."""
from contextlib import contextmanager
from time import time
from typing import Generator
from haddock import log
[docs]
@contextmanager
def log_time(pre_msg: str) -> Generator[None, None, None]:
"""
Log the time taken to execute the code under the context.
Examples
--------
>>> with log_time("function took"):
do_something()
do_more()
logged: "function tooked 10 minutes"
Parameters
----------
pre_msg : str
String to log with appended time.
See Also
--------
:py:func:`convert_seconds_to_min_sec`
"""
start = time()
yield
end = time()
elapsed = convert_seconds_to_min_sec(end - start)
log.info(f"{pre_msg} {elapsed}")
[docs]
def convert_seconds_to_min_sec(seconds: float) -> str:
"""
Convert seconds to min&sec.
Examples
--------
>>> convert_seconds_to_min_sec(60)
1 minute
>>> convert_seconds_to_min_sec(120)
2 minutes and 0 seconds
>>> convert_seconds_to_min_sec(179)
2 minutes and 59 seconds
Parameters
----------
seconds : int
The elapsed time in seconds. Seconds are round to integers.
Returns
-------
str
"""
seconds = int(round(seconds, 0))
hours = seconds // 3600
minutes = (seconds) // 60 % 60
seconds = (seconds) % 60
if hours:
return f"{hours}h{minutes}m{seconds}s"
if minutes:
s = "" if minutes == 1 else "s"
return f"{minutes} minute{s} and {seconds} seconds"
s = "" if seconds == 1 else "s"
return f"{seconds} seconds"