这是一个记录时间节点和代码运行顺序的计时器,可以在代码任意位置调用记录运行时间,保存到本地 .csv
文件。
✨代码部分 创建 timer.py
文件,创建 GlobalTimer
类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 import time as tfrom typing import Dict , List import pandas as pdclass 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 ) 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:
1 2 3 4 5 6 7 8 9 10 from timer import GlobalTimerif __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} " )
结果:
1 func result: 2, time: {'test_time' : [0.0]}
示例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 from timer import GlobalTimerif __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:
1 2 3 4 5 6 7 8 9 10 11 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 ]))