Skip to content
Merged
Show file tree
Hide file tree
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
12 changes: 7 additions & 5 deletions codetiming/_timer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
"""

# Standard library imports
import time
from contextlib import ContextDecorator
from dataclasses import dataclass, field
import time
from math import nan
from typing import Any, Callable, ClassVar, Dict, Optional


Expand All @@ -24,6 +25,7 @@ class Timer(ContextDecorator):
text: str = "Elapsed time: {:0.4f} seconds"
logger: Optional[Callable[[str], None]] = print
_start_time: Optional[float] = field(default=None, init=False, repr=False)
last: float = field(default=nan, init=False, repr=False)

def __post_init__(self) -> None:
"""Initialization: add timer to dict of timers"""
Expand All @@ -43,16 +45,16 @@ def stop(self) -> float:
raise TimerError(f"Timer is not running. Use .start() to start it")

# Calculate elapsed time
elapsed_time = time.perf_counter() - self._start_time
self.last = time.perf_counter() - self._start_time
self._start_time = None

# Report elapsed time
if self.logger:
self.logger(self.text.format(elapsed_time))
self.logger(self.text.format(self.last))
if self.name:
self.timers[self.name] += elapsed_time
self.timers[self.name] += self.last

return elapsed_time
return self.last

def __enter__(self) -> "Timer":
"""Start a new timer as a context manager"""
Expand Down
13 changes: 12 additions & 1 deletion tests/test_codetiming.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
"""
# Standard library imports
import re
import time
from math import isnan

# Third party imports
import pytest

# Codetiming imports
from codetiming import Timer, TimerError


#
# Test functions
#
Expand Down Expand Up @@ -164,3 +165,13 @@ def test_error_if_restarting_running_timer():
t.start()
with pytest.raises(TimerError):
t.start()


def test_timer_sets_last():
t = Timer()
assert isnan(t.last)
t.start()
time.sleep(0.1)
t.stop()

assert 0.1 <= t.last