Timer

The code in this notebook helps with measuring time.

Prerequisites

  • This notebook needs some understanding on advanced concepts in Python, notably
    • classes
    • the Python with statement
    • measuring time

Synopsis

To use the code provided in this chapter, write

>>> from debuggingbook.Timer import <identifier>

and then make use of the following features.

The Timer class allows you to measure elapsed real time (in fractional seconds). Its typical usage is in conjunction with a with clause:

>>> with Timer() as t:
>>>     some_long_running_function()
>>> t.elapsed_time()
0.02475320800112968

Measuring Time

The class Timer allows measuring the elapsed time during some code execution.

import time
def clock() -> float:
    """
    Return the number of fractional seconds elapsed since some point of reference.
    """
    return time.perf_counter()
from types import TracebackType
class Timer:
    def __init__(self) -> None:
        """Constructor"""
        self.start_time = clock()
        self.end_time = None

    def __enter__(self) -> Any:
        """Begin of `with` block"""
        self.start_time = clock()
        self.end_time = None
        return self

    def __exit__(self, exc_type: Type, exc_value: BaseException,
                 tb: TracebackType) -> None:
        """End of `with` block"""
        self.end_time = clock()

    def elapsed_time(self) -> float:
        """Return elapsed time in seconds"""
        if self.end_time is None:
            # still running
            return clock() - self.start_time
        else:
            return self.end_time - self.start_time

Here's an example:

def some_long_running_function() -> None:
    i = 1000000
    while i > 0:
        i -= 1
print("Stopping total time:")
with Timer() as t:
    some_long_running_function()
print(t.elapsed_time())
Stopping total time:
0.024604500000350527
print("Stopping time in between:")
with Timer() as t:
    for i in range(10):
        some_long_running_function()
        print(t.elapsed_time())
Stopping time in between:
0.024645499999678577
0.04903750000084983
0.0736815000000206
0.09849070900054357
0.12325487499947485
0.14797141700000793
0.17294362500069838
0.1983805840009154
0.22383649999937916
0.24952462500004913

That's it, folks – enjoy!

Lessons Learned

  • With the Timer class, it is very easy to measure elapsed time.

Creative Commons License The content of this project is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. The source code that is part of the content, as well as the source code used to format and display that content is licensed under the MIT License. Last change: 2023-11-11 18:25:47+01:00CiteImprint