longling.lib.clock 源代码

# coding: utf-8
from __future__ import absolute_import

import logging
import time
from contextlib import contextmanager

from longling.lib.utilog import config_logging

_logger = config_logging(logger="clock", console_log_level=logging.INFO)

__all__ = ["Clock", "print_time", "Timer"]





[文档]class Clock(object): r""" 计时器。 包含两种时间:wall_time 和 process_time * wall_time: 包括等待时间在内的程序运行时间 * process_time: 不包括等待时间在内的程序运行时间 Parameters ---------- store_dict: dict or None with closure 中存储运行时间 logger: logging.logger 日志 tips: str 提示前缀 Examples -------- .. code-block :: python with Clock(): a = 1 + 1 clock = Clock() clock.start() # some code clock.end(wall=True) # default to return the wall_time, to get process_time, set wall=False """ def __init__(self, store_dict: (dict, None) = None, logger: (logging.Logger, None) = _logger, tips=''): assert store_dict is None or type(store_dict) is dict self.process_st = 0 self.process_et = 0 self.wall_st = 0 self.wall_et = 0 self.store_dict = store_dict self.logger = logger self.tips = tips
[文档] def start(self): """开始计时""" self.process_st = time.process_time() self.wall_st = time.time() return self.process_st
def time(self): return time.time() - self.wall_st
[文档] def end(self, wall=True): """计时结束,返回间隔时间""" self.process_et = time.process_time() self.wall_et = time.time() if wall: return self.wall_time else: return self.process_time
@property def wall_time(self): """获取程序运行时间(包括等待时间)""" return self.wall_et - self.wall_st @property def process_time(self): """获取程序运行时间(不包括等待时间)""" return self.process_et - self.process_st def __enter__(self): if self.tips: if self.logger is not None: self.logger.info(self.tips) self.start() return self def __exit__(self, exc_type, exc_val, exc_tb): if self.logger is not None: self.logger.info( '%ss' % self.end() if not self.tips else '%s %ss' % ( self.tips, self.end() ) ) if self.store_dict is not None: self.store_dict['wall_time'] = self.wall_time self.store_dict['process_time'] = self.process_time
Timer = Clock