Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 45 additions & 42 deletions codeflash/code_utils/time_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,58 +7,61 @@


def humanize_runtime(time_in_ns: int) -> str:
runtime_human: str = str(time_in_ns)
runtime_human: str
units = "nanoseconds"
if 1 <= time_in_ns < 2:
units = "nanosecond"

if time_in_ns / 1000 >= 1:
time_micro = float(time_in_ns) / 1000

if time_in_ns >= 1_000:
# Direct unit determination and formatting without external library
if time_micro < 1000:
runtime_human = f"{time_micro:.3g}"
units = "microseconds" if time_micro >= 2 else "microsecond"
elif time_micro < 1000000:
time_milli = time_micro / 1000
runtime_human = f"{time_milli:.3g}"
units = "milliseconds" if time_milli >= 2 else "millisecond"
elif time_micro < 60000000:
time_sec = time_micro / 1000000
runtime_human = f"{time_sec:.3g}"
units = "seconds" if time_sec >= 2 else "second"
elif time_micro < 3600000000:
time_min = time_micro / 60000000
runtime_human = f"{time_min:.3g}"
units = "minutes" if time_min >= 2 else "minute"
elif time_micro < 86400000000:
time_hour = time_micro / 3600000000
runtime_human = f"{time_hour:.3g}"
units = "hours" if time_hour >= 2 else "hour"
if time_in_ns < 1_000_000:
time_val = float(time_in_ns) / 1_000.0
runtime_human = f"{time_val:.3g}"
units = "microseconds" if time_val >= 2 else "microsecond"
elif time_in_ns < 1_000_000_000:
time_val = float(time_in_ns) / 1_000_000.0
runtime_human = f"{time_val:.3g}"
units = "milliseconds" if time_val >= 2 else "millisecond"
elif time_in_ns < 60_000_000_000:
time_val = float(time_in_ns) / 1_000_000_000.0
runtime_human = f"{time_val:.3g}"
units = "seconds" if time_val >= 2 else "second"
elif time_in_ns < 3_600_000_000_000:
time_val = float(time_in_ns) / 60_000_000_000.0
runtime_human = f"{time_val:.3g}"
units = "minutes" if time_val >= 2 else "minute"
elif time_in_ns < 86_400_000_000_000:
time_val = float(time_in_ns) / 3_600_000_000_000.0
runtime_human = f"{time_val:.3g}"
units = "hours" if time_val >= 2 else "hour"
else: # days
time_day = time_micro / 86400000000
runtime_human = f"{time_day:.3g}"
units = "days" if time_day >= 2 else "day"

runtime_human_parts = str(runtime_human).split(".")
if len(runtime_human_parts[0]) == 1:
if runtime_human_parts[0] == "1" and len(runtime_human_parts) > 1:
time_val = float(time_in_ns) / 86_400_000_000_000.0
runtime_human = f"{time_val:.3g}"
units = "days" if time_val >= 2 else "day"
else:
runtime_human = str(time_in_ns)

# Use partition instead of split to avoid list allocation
head, sep, tail = runtime_human.partition(".")

# Reproduce original formatting rules exactly
if len(head) == 1:
if head == "1" and sep:
# original code appended 's' when integer part == "1" and there was a fractional part
units = units + "s"
if len(runtime_human_parts) == 1:
runtime_human = f"{runtime_human_parts[0]}.00"
elif len(runtime_human_parts[1]) >= 2:
runtime_human = f"{runtime_human_parts[0]}.{runtime_human_parts[1][0:2]}"
if not sep: # no fractional part
runtime_human = f"{head}.00"
elif len(tail) >= 2:
runtime_human = f"{head}.{tail[0:2]}"
else:
runtime_human = (
f"{runtime_human_parts[0]}.{runtime_human_parts[1]}{'0' * (2 - len(runtime_human_parts[1]))}"
)
elif len(runtime_human_parts[0]) == 2:
if len(runtime_human_parts) > 1:
runtime_human = f"{runtime_human_parts[0]}.{runtime_human_parts[1][0]}"
runtime_human = f"{head}.{tail}{'0' * (2 - len(tail))}"
elif len(head) == 2:
if sep and tail:
runtime_human = f"{head}.{tail[0]}"
else:
runtime_human = f"{runtime_human_parts[0]}.0"
runtime_human = f"{head}.0"
else:
runtime_human = runtime_human_parts[0]
runtime_human = head

return f"{runtime_human} {units}"

Expand Down
Loading