跟踪python代码块时间的小工具。

about-time的Python项目详细描述


CoverageMaintenancePyPI versionPyPI pyversionsPyPI status

关于时间

跟踪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.44s3.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 elementsthroughput_human
1.10'10.0/s'
1.2500'2500.0/s'
2.1'30.0/m'
2.10'5.0/s'
1.98198198198198211'5.55/s'
100.10'6.0/m'
1600.3'6.75/h'
.991'1.01/s'
1165263.123'0.38/h'

准确度

此工具支持所有版本的python,但在pythons中,=3.3,代码使用新的time.perf_counter来获得更高的分辨率和更小的错误传播。在旧版本中,它使用time.time

许可证

这个软件是根据麻省理工学院的许可证授权的。有关许可证全文,请参阅顶部分发目录中的许可证文件。

不错吧?

谢谢你的兴趣!

我希望你用这个工具玩得开心!:)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我需要在一个数组中添加1000个介于1和100之间的整数及其出现次数,然后显示它们   如何在java中将两个不同的excel文件作为数据库连接到同一台服务器上?   java JSP编译错误令牌“throws”语法错误,应为throw   java如何使用Jetty HTTP客户端和MultiPartContentProvider上载BuffereImage?   具有多个方法对象的java测试类   在java中比较字符串和打印剩余字符时出现意外输出?   java设置JPanel的大小,当其中没有组件时   使用exoplayer播放m3u8文件的java   JSON中未添加Jackson@type的java Rest JSON   java如何为heroku创建procfile文件?   基于数组的java信息存储   sockets java。网SocketTimeoutException:在Tomcat下读取超时   安卓x的java问题。偏爱安卓工作室   java我的方法没有按预期运行   java如何通过单击单选按钮将值从表传递到servlet?   java无法获取instagram个人资料图片的完整大小