@@ -52,6 +52,65 @@ def warpper(*args, **kwargs):
5252 return warpper
5353
5454
55+ class Timeit :
56+ '''上下文管理器, 记录耗时/平均耗时
57+
58+ Example
59+ ----------------------
60+ from torch4keras.snippets import Timeit
61+ with Timeit() as ti:
62+ for i in range(10):
63+ time.sleep(0.1)
64+ # ti.lap(prefix=i, restart=False) # 统计累计耗时
65+ # ti.lap(prefix=i, restart=True) # 统计间隔耗时
66+ # ti.lap(count=10, prefix=i, restart=True) # 统计每段速度
67+ # ti(10) # 统计速度
68+ '''
69+ def __enter__ (self ):
70+ self .count = None
71+ self .start_tm = time .time ()
72+ self .template = 'Average speed: {:.2f}/s'
73+ return self
74+
75+ def __call__ (self , count ):
76+ self .count = count
77+
78+ def restart (self ):
79+ '''自定义开始记录的地方'''
80+ self .start_tm = time .time ()
81+
82+ def lap (self , count :int = None , prefix :str = None , restart = False ):
83+ '''
84+ :params count: 需要计算平均生成速度中统计的次数
85+ :params prefix: 打印时候自定义的前缀
86+ :params restart: 是否重置start_tm, True只记录时间间隔,否则记录的是从一开始的累计时间
87+ '''
88+ if count is not None :
89+ self .count = count
90+ prefix = '' if prefix is None else str (prefix ).strip () + ' - '
91+
92+ end_tm = time .time ()
93+ consume = end_tm - self .start_tm
94+ if self .count is None :
95+ consume = format_time (consume , hhmmss = False )
96+ start1 = time .strftime ("%Y-%m-%d %H:%M:%S" , time .localtime (self .start_tm ))
97+ end1 = time .strftime ("%Y-%m-%d %H:%M:%S" , time .localtime (end_tm ))
98+ log_info (prefix + f'Cost { consume } [{ start1 } < { end1 } ]' )
99+ elif consume > 0 :
100+ speed = self .count / consume
101+ log_info (prefix + self .template .format (speed ))
102+ else :
103+ pass
104+ # log_warn('Time duration = 0')
105+
106+ if restart :
107+ self .restart ()
108+
109+ def __exit__ (self , exc_type , exc_val , exc_tb ):
110+ self .lap ()
111+ print ()
112+
113+
55114def send_email (mail_receivers :Union [str ,list ], mail_subject :str , mail_msg :str = "" , mail_host :str = None ,
56115 mail_user :str = None , mail_pwd :str = None , mail_sender :str = None ):
57116 ''' 发送邮件(默认使用笔者自己注册的邮箱,若含敏感信息请使用自己注册的邮箱)
0 commit comments