利用time模块实现一个简单计时器

利用time模块实现一个简单计时器

统计程序执行所消耗的时间是经常会用到的,python标准库里的timeit模块可以用来直接统计程序消耗时间,可以参考官方文档。在这里用time模块构造了一个简单的计时器,使用简单,也比较灵活。

import time

class Timer:
    def __init__(self, func=time.perf_counter):
        self.elapsed = 0.0
        self._func = func
        self._start = None

    def start(self):
        if self._start is not None:
            raise RuntimeError('Already started')
        self._start = self._func()

    def stop(self):
        if self._start is None:
            raise RuntimeError('Not started')
        end = self._func()
        self.elapsed += end - self._start
        self._start = None

    def reset(self):
        self.elapsed = 0.0

    @property
    def running(self):
        return self._start is not None

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, *args):
        self.stop()

这个类定义了一个可以被用户根据需要启动、停止和重置的计时器,实例化后可以通过调用实例方法来使用;类中实现了__enter__和__exit__上下文管理器的特殊方法,所以也可以通过上下文with方式调用,它会在 elapsed 属性中记录整个消耗时间。 下面是一个例子来演示怎样使用它:

def countdown(n):
    while n > 0:
        n -= 1

# 调用实例方法来使用
t = Timer()
t.start()
countdown(1000000)
t.stop()
print(t.elapsed)

#通过上下文管理器方式调用
with t:
    countdown(1000000)

print(t.elapsed)

with Timer() as t2:
    countdown(1000000)
print(t2.elapsed)

在计时中要考虑一个底层的时间函数问题。一般来说, 使用 time.time()time.clock() 计算的时间精度因操作系统的不同会有所不同。 而使用 time.perf_counter() 函数可以确保使用系统上面最精确的计时器。

上述代码中由 Timer 类记录的时间是钟表时间,并包含了所有休眠时间。 如果你只想计算该进程所花费的CPU时间,应该使用 time.process_time() 来代替:

t = Timer(time.process_time)
with t:
    countdown(1000000)
print(t.elapsed)

time.perf_counter()time.process_time() 都会返回小数形式的秒数时间,这两个是python3中才有的方法,如果是python2的话将其替换为time.time()即可

Comments are closed.