跟踪python代码块时间的小工具。
about-time的Python项目详细描述
关于时间
跟踪python代码块时间的小工具。
它是做什么的?
有时,我需要一些东西来记录代码执行,或者提取要发送到inflox的度量,所以我创建了这个工具。
当需要同时跟踪两条或多条线/块,或同时跟踪块的全部/部分关系时,简单的start = time.time()
和end = time.time() - start
不会剪切它。
这个工具可以测量代码块的执行时间,甚至可以通过漂亮的“人”表示来计算迭代次数和系统吞吐量。
如何安装?
就在你的python venv中做:
$ pip install about-time
如何使用?
有三种操作模式:上下文管理器、可调用处理程序和迭代器度量。
一。像上下文管理器一样使用:
fromabout_timeimportabout_timewithabout_time()ast_whole:withabout_time()ast_1:func_1()withabout_time()ast_2:func_2('params')
然后,获取如下计时:
# python 3.7 example, using f strings.print(f'func_1 time: {t_1.duration_human}')print(f'func_2 time: {t_2.duration_human}')print(f'total time: {t_whole.duration_human}')
还有duration
属性,它返回以秒为单位的实际浮点时间。
secs=t_whole.duration
2.像可调用的处理程序一样使用它:
t_1=about_time(func_1)t_2=about_time(lambda:func_2('params'))
如果使用可调用处理程序语法,将有一个名为result
的新字段来获取函数的结果!
results=t_1.result,t_2.result
或者您可以混合和匹配:
withabout_time()ast_whole:t_1=about_time(func_1)t_2=about_time(lambda:func_2('params'))
三。使用它来计算迭代次数并测量吞吐量:
把你的iterable包起来,重复它!因为我们内部有持续时间信息,所以它可以计算整个块的吞吐量。在没有长度的生成器中特别有用(但您可以将其与任何iterable一起使用):
此模式需要一个小的回调函数(可以是内部函数或lambda),允许您以任何方式使用for
循环,当iterable耗尽时,回调将自动调用。
defcallback(t_func):logger.info('func: size=%d throughput=%s',t_func.count,t_func.throughput_human)items=filter(...)foriteminabout_time(callback,items):# use item any way you want.process(item)# the callback is already called upon getting here.
一些不错的功能
人类是一等公民:)
我考虑过设计人性化函数的两个关键概念:3.44s
比3.43584783784s
更有意义,14.12us
比.0000141233333s
更好。换一种说法,我最多将值四舍五入到小数点后两位,然后找到表示它的较小单位,将小于1
的值最小化。
请注意,考虑到应用了舍入,它会动态地找到表示该值的最佳单位。因此,如果一个值是例如0.999999
,它在舍入后会像1000.0ms
一样结束,但它会自动升级到下一个单元1.0s
。
duration_human
将从纳秒无缝地更改为小时。小于60秒的值最多以两位数精度呈现(小数点右侧的零未显示),从1分钟开始,呈现“hours:minutes:seconds.m”毫秒(只有一位数精度)。直接来自单元测试的一些示例:
duration (float seconds) | duration_human |
---|---|
.00000000185 | '1.85ns' |
.000000999996 | '1.0us' |
.00001 | '10.0us' |
.0000156 | '15.6us' |
.01 | '10.0ms' |
.0141233333333 | '14.12ms' |
.1099999 | '110.0ms' |
.1599999 | '160.0ms' |
.8015 | '801.5ms' |
3.434999 | '3.43s' |
59.999 | '0:01:00' |
68.5 | '0:01:08.5' |
125.825 | '0:02:05.8' |
4488.395 | '1:14:48.4' |
这个throughput_human
有着相似的逻辑,而对于人脑来说,更难弄清楚:如果处理1165263
项需要123
秒,它的速度有多快?即使是为了找出每个项目的时间9473
秒也没有多大意义。除以3600
我们得到每个项目的2.63
小时,并且吞吐量很好地返回为0.38/h
。该工具具有每秒、每分钟和每小时。一些示例:
duration (float seconds) | number of elements | throughput_human |
---|---|---|
1. | 10 | '10.0/s' |
1. | 2500 | '2500.0/s' |
2. | 1 | '30.0/m' |
2. | 10 | '5.0/s' |
1.981981981981982 | 11 | '5.55/s' |
100. | 10 | '6.0/m' |
1600. | 3 | '6.75/h' |
.99 | 1 | '1.01/s' |
1165263. | 123 | '0.38/h' |
准确度
此工具支持所有版本的python,但在pythons中,=3.3
,代码使用新的time.perf_counter
来获得更高的分辨率和更小的错误传播。在旧版本中,它使用time.time
。
许可证
这个软件是根据麻省理工学院的许可证授权的。有关许可证全文,请参阅顶部分发目录中的许可证文件。
不错吧?
谢谢你的兴趣!
我希望你用这个工具玩得开心!:)