前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【星光05】全局计时器

【星光05】全局计时器

作者头像
杨丝儿
发布2022-04-11 16:23:31
1550
发布2022-04-11 16:23:31
举报
文章被收录于专栏:杨丝儿的小站

这是一个记录时间节点和代码运行顺序的计时器,可以在代码任意位置调用记录运行时间,保存到本地 .csv 文件。

✨代码部分

创建 timer.py 文件,创建 GlobalTimer 类。

代码语言:javascript
复制
import time as t
from typing import Dict, List

import pandas as pd


class GlobalTimer:
    """
    全局计时器,跨文件实现代码的时间节点记录。
    """
    __time_dict: Dict[str, List[float or None]] = {}  # 时间存储字典
    time_slice_count: int = 0  # 时间切片计数

    def __init__(self):
        pass

    def timing(self, name: str, func, para: tuple):
        """
        测量某一函数的运行时间。
        :param name: 时间片段名称
        :param func: 函数
        :param para: 函数输入参数,元组类型
        :return: 函数的返回值
        """
        # 计时部分
        start_time = t.time()
        value_return = func(*para)
        end_time = t.time()
        # 记录时间
        time = end_time - start_time
        self.add_value(name, time)
        # 返回函数输出
        return value_return

    def add_value(self, name: str, time: float):
        """
        添加时间到时间存储字典,并增加时间切片数值。
        :param name: 时间片段名称
        :param time: 时间
        """
        # 判断是否存在记录,如果不存在,则新建历史记录
        if name not in self.__time_dict.keys():
            self.__time_dict[name] = [None for _ in range(self.time_slice_count)]
        # 添加新的记录
        for key, value in self.__time_dict.items():
            if key == name:
                value.append(time)
            else:
                value.append(None)
        # 时间切片加1
        self.time_slice_count += 1

    def get_value(self):
        return self.__time_dict

    def save_local(self, path):
        pd.DataFrame(self.__time_dict).to_csv(path)

    def __str__(self):
        return str(self.__time_dict)

✨使用部分

注:所有的示例使用匿名函数,实际使用时不推荐。

示例1:

代码语言:javascript
复制
from timer import GlobalTimer

if __name__ == '__main__':
    global_timer = GlobalTimer()

    result = global_timer.timing(name="test_time",
                                 func=lambda x, y: x + y,
                                 para=(1, 1))

    print(f"func result: {result}, time: {global_timer}")

结果:

代码语言:javascript
复制
func result: 2, time: {'test_time': [0.0]}

示例2:

代码语言:javascript
复制
from timer import GlobalTimer

if __name__ == '__main__':
    global_timer = GlobalTimer()
    global_timer.timing(name="test1_time",
                        func=lambda x, y: x + y,
                        para=(1, 1))
    global_timer.timing(name="test2_time",
                        func=lambda x, y: x + y,
                        para=(1, 1))
    global_timer.timing(name="test3_time",
                        func=lambda x, y: x + y,
                        para=(1, 1))
    global_timer.timing(name="test2_time",
                        func=lambda x, y: x + y,
                        para=(1, 1))
    global_timer.save_local("./time.csv")

结果:

time.csv
time.csv

示例3:

代码语言:javascript
复制
# 对于只有一个输入参数的 func 需要注意元组类型的写法,以下方法任选其一。

# 推荐
global_timer.timing(name="test_time",
                    func=lambda x: x,
                    para=(1,))

# 或者
global_timer.timing(name="test_time",
                    func=lambda x: x,
                    para=tuple([1]))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ✨代码部分
  • ✨使用部分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档