diff --git a/codeflash/code_utils/time_utils.py b/codeflash/code_utils/time_utils.py index 12afc6363..8b2625d15 100644 --- a/codeflash/code_utils/time_utils.py +++ b/codeflash/code_utils/time_utils.py @@ -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}"