Spaces:
Running
Running
| import time | |
| import json | |
| class Timer: | |
| def __init__(self, name=None): | |
| self.name = name | |
| self.start_time = None | |
| self.steps = [] | |
| self.total_time = None | |
| def clear(self): | |
| self.start_time = None | |
| self.steps = [] | |
| self.total_time = None | |
| def start(self): | |
| """Start the timer.""" | |
| self.start_time = time.time() | |
| def is_running(self): | |
| return self.start_time is not None | |
| def add_step(self, step_name): | |
| """Add a step with its duration since the last step or start.""" | |
| if self.start_time is None: | |
| self.start() | |
| current_time = time.time() | |
| if not self.steps: | |
| elapsed = current_time - self.start_time | |
| else: | |
| elapsed = current_time - self.steps[-1]['timestamp'] | |
| self.steps.append({ | |
| "step_name": step_name, | |
| "duration": round(elapsed, 4), | |
| "total_duration": round(current_time - self.start_time, 4), | |
| "timestamp": current_time | |
| }) | |
| def end(self): | |
| """End the timer and calculate the total duration.""" | |
| if self.start_time is None: | |
| raise RuntimeError("Timer has not been started.") | |
| if not self.steps: | |
| raise RuntimeError("No steps have been added.") | |
| self.total_time = time.time() - self.start_time | |
| def to_json(self): | |
| """Return a JSON of the timing steps.""" | |
| if self.total_time is None: | |
| raise RuntimeError("Timer has not been ended.") | |
| output_steps = {} | |
| for step in self.steps: | |
| output_steps[step["step_name"]] = step["duration"] | |
| highlights = {"total_time": round(self.total_time, 4)} | |
| if self.name: | |
| highlights = {"name": self.name, **highlights} | |
| output = { | |
| **highlights, | |
| **output_steps | |
| } | |
| return output | |
| def to_json_str(self): | |
| """Return a human-readable JSON of the timing steps.""" | |
| return json.dumps(self.to_json(), indent=4) | |
| def formatted_result(self): | |
| """Return a list of the steps, their duration, and total duration.""" | |
| if self.total_time is None: | |
| raise RuntimeError("Timer has not been ended.") | |
| line_buffer = [] | |
| if self.name: | |
| line_buffer.append(f"Timer: {self.name}") | |
| for step in self.steps: | |
| line_buffer.append(f"[{step['duration']:05.2f}s, {step['total_duration']:05.2f}s] {step['step_name']}") | |
| # for step in self.steps: | |
| # line_buffer.append(f"{step['step_name']}: {step['duration']:.2f}s ({step['total_duration']:.2f}s)") | |
| line_buffer.append(f"Total time: {self.total_time:.2f}s") | |
| return "\n".join(line_buffer) | |
| def log_formatted_result(self): | |
| print(self.formatted_result()) | |
| def example(): | |
| # Example usage | |
| timer = Timer() | |
| timer.start() | |
| # Simulating some steps | |
| time.sleep(1) # Simulate work for step 1 | |
| timer.add_step("Step 1") | |
| time.sleep(2) # Simulate work for step 2 | |
| timer.add_step("Step 2") | |
| timer.end() | |
| # Print the timer output | |
| print(timer.formatted_result()) | |
| print(timer.to_json_str()) | |
| if __name__ == "__main__": | |
| example() | |