这是一个记录时间节点和代码运行顺序的计时器,可以在代码任意位置调用记录运行时间,保存到本地 .csv
文件。
✨代码部分
创建 timer.py
文件,创建 GlobalTimer
类。
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")
结果:
示例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]))