|
5 | 5 | import copy
|
6 | 6 | import functools
|
7 | 7 | from .log import log_info, log_warn, log_error
|
| 8 | +from pprint import pprint |
8 | 9 |
|
9 | 10 |
|
10 | 11 | def format_time(eta, hhmmss=True):
|
@@ -61,56 +62,108 @@ class Timeit:
|
61 | 62 | with Timeit() as ti:
|
62 | 63 | for i in range(10):
|
63 | 64 | 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) # 统计每段速度 |
| 65 | + # ti.lap(name=i, restart=False) # 统计累计耗时 |
| 66 | + # ti.lap(name=i, restart=True) # 统计间隔耗时 |
| 67 | + # ti.lap(count=10, name=i, restart=True) # 统计每段速度 |
67 | 68 | # ti(10) # 统计速度
|
68 | 69 | '''
|
69 |
| - def __enter__(self): |
| 70 | + def __enter__(self, template='Average speed: {:.2f}/s'): |
70 | 71 | self.count = None
|
71 | 72 | self.start_tm = time.time()
|
72 |
| - self.template = 'Average speed: {:.2f}/s' |
| 73 | + self.template = template |
73 | 74 | return self
|
74 | 75 |
|
75 | 76 | def __call__(self, count):
|
76 | 77 | self.count = count
|
77 | 78 |
|
78 |
| - def restart(self): |
| 79 | + def reset(self): |
79 | 80 | '''自定义开始记录的地方'''
|
80 | 81 | self.start_tm = time.time()
|
81 | 82 |
|
82 |
| - def lap(self, count:int=None, prefix:str=None, restart=False): |
| 83 | + def lap(self, name:str=None, count:int=None, reset=False): |
83 | 84 | '''
|
| 85 | + :params name: 打印时候自定义的前缀 |
84 | 86 | :params count: 需要计算平均生成速度中统计的次数
|
85 |
| - :params prefix: 打印时候自定义的前缀 |
86 |
| - :params restart: 是否重置start_tm, True只记录时间间隔,否则记录的是从一开始的累计时间 |
| 87 | + :params reset: 是否重置start_tm, True只记录时间间隔,否则记录的是从一开始的累计时间 |
87 | 88 | '''
|
88 | 89 | if count is not None:
|
89 | 90 | self.count = count
|
90 |
| - prefix = '' if prefix is None else str(prefix).strip() + ' - ' |
| 91 | + name = '' if name is None else str(name).strip() + ' - ' |
91 | 92 |
|
92 | 93 | end_tm = time.time()
|
93 | 94 | consume = end_tm - self.start_tm
|
94 | 95 | if self.count is None:
|
| 96 | + # 只log时间 |
95 | 97 | consume = format_time(consume, hhmmss=False)
|
96 | 98 | start1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.start_tm))
|
97 | 99 | end1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_tm))
|
98 |
| - log_info(prefix + f'Cost {consume} [{start1} < {end1}]') |
| 100 | + log_info(name + f'Cost {consume} [{start1} < {end1}]') |
99 | 101 | elif consume > 0:
|
100 | 102 | speed = self.count / consume
|
101 |
| - log_info(prefix + self.template.format(speed)) |
| 103 | + log_info(name + self.template.format(speed)) |
102 | 104 | else:
|
103 | 105 | pass
|
104 | 106 | # log_warn('Time duration = 0')
|
105 | 107 |
|
106 |
| - if restart: |
107 |
| - self.restart() |
| 108 | + if reset: |
| 109 | + self.reset() |
108 | 110 |
|
109 | 111 | def __exit__(self, exc_type, exc_val, exc_tb):
|
110 | 112 | self.lap()
|
111 | 113 | print()
|
112 | 114 |
|
113 | 115 |
|
| 116 | +class Timeit2: |
| 117 | + '''记录耗时 |
| 118 | +
|
| 119 | + Example |
| 120 | + ---------------------- |
| 121 | + ti = Timeit2() |
| 122 | + for i in range(10): |
| 123 | + time.sleep(0.1) |
| 124 | + ti.lap(name=i) |
| 125 | + ti.end() # 打印各个步骤时长 |
| 126 | + ''' |
| 127 | + def __init__(self): |
| 128 | + self.reset() |
| 129 | + |
| 130 | + def __call__(self, *args, **kwargs): |
| 131 | + self.lap(*args, **kwargs) |
| 132 | + |
| 133 | + def reset(self): |
| 134 | + '''自定义开始记录的地方''' |
| 135 | + self.cost = dict() |
| 136 | + self.count = dict() |
| 137 | + self.start_tm = time.time() |
| 138 | + |
| 139 | + def restart(self): |
| 140 | + self.start_tm = time.time() |
| 141 | + |
| 142 | + def lap(self, name:str): |
| 143 | + ''' |
| 144 | + :params name: 打印时候自定义的前缀 |
| 145 | + ''' |
| 146 | + end_tm = time.time() |
| 147 | + consume = end_tm - self.start_tm |
| 148 | + name = str(name) |
| 149 | + self.cost[name] = self.cost.get(name, 0) + consume |
| 150 | + self.count[name] = self.count.get(name, 0) + 1 |
| 151 | + self.start_tm = time.time() |
| 152 | + |
| 153 | + def end(self, verbose=1): |
| 154 | + for k, v in self.count.items(): |
| 155 | + if v > 1: |
| 156 | + self.cost['avg_' + k] = self.cost[k] / v |
| 157 | + |
| 158 | + if verbose > 0: |
| 159 | + log_info('Cost detail') |
| 160 | + pprint(self.cost) |
| 161 | + print() |
| 162 | + |
| 163 | + self.reset() |
| 164 | + return self.cost |
| 165 | + |
| 166 | + |
114 | 167 | def send_email(mail_receivers:Union[str,list], mail_subject:str, mail_msg:str="", mail_host:str=None,
|
115 | 168 | mail_user:str=None, mail_pwd:str=None, mail_sender:str=None):
|
116 | 169 | ''' 发送邮件(默认使用笔者自己注册的邮箱,若含敏感信息请使用自己注册的邮箱)
|
|
0 commit comments