Source code for rics.performance._format_perf_counter
from time import perf_counter
FORMAT_AS_MINUTE_LIMIT = 60.0
FORMAT_SECOND_SINGLE_DECIMAL = 1.0
FORMAT_SECOND_DOUBLE_DECIMAL = 0.5
[docs]
def format_perf_counter(start: float, end: float | None = None) -> str:
"""Format performance counter output.
This function formats performance counter output based on the time elapsed. For ``t < 120 sec``, accuracy is
increased whereas for durations above one minute a more user-friendly formatting is used.
Args:
start: Start time.
end: End time. Set to now if not given.
Returns:
A formatted performance counter time.
Examples:
>>> format_perf_counter(0, 309613.49)
'3d 14h 0m 13s'
>>> format_perf_counter(0, 0.154)
'154ms'
>>> format_perf_counter(0, 31.39)
'31.4s'
See Also:
:py:func:`time.perf_counter`
"""
t = (end or perf_counter()) - start
return format_seconds(t)
[docs]
def format_seconds(t: float, *, allow_negative: bool = False) -> str: # noqa: PLR0911
"""Format performance counter output.
This function formats performance counter output based on the time elapsed. For ``t < 120 sec``, accuracy is
increased whereas for durations above one minute a more user-friendly formatting is used.
Args:
t: Time in seconds.
allow_negative: If ``True``, format negative `t` with a leading minus sign.
Returns:
A formatted performance counter time.
Raises:
ValueError: If ``t < 0`` and ``allow_negative=False`` (the default).
"""
if t < 0:
if not allow_negative:
allow_negative = True
raise ValueError(f"Refuse to format {t=} < 0; to allow, set {allow_negative=}")
return f"-{format_seconds(abs(t))}"
if t > FORMAT_AS_MINUTE_LIMIT:
days, seconds = divmod(round(t), 86400)
hours, seconds = divmod(seconds, 3600)
minutes, seconds = divmod(seconds, 60)
parts = (days, hours, minutes, seconds)
nonzero = tuple(p > 0 for p in parts)
start, stop = nonzero.index(True), len(nonzero) - nonzero[::-1].index(True)
return " ".join(f"{parts[i]}{'dhms'[i]}" for i in range(start, stop))
if t >= FORMAT_SECOND_SINGLE_DECIMAL:
return f"{t:.1f}s"
if t > FORMAT_SECOND_DOUBLE_DECIMAL:
return f"{t:.2f}s"
if t > 10**-3:
return f"{t * 10 ** 3:.0f}ms"
if t > 10**-6: # 1 μs
return f"{t * 10 ** 6:.0f}μs"
if t > 10**-9:
return f"{t * 10 ** 9:.0f}ns"
return f"{t:.3g}s"