简化对应用程序选定部分计时的日志记录。
timing的Python项目详细描述
创建计时模块是为了简化应用程序选定部分的计时记录
如何使用
建议初始化如下。
importtiming_TIME=timing.get_timing_group(__name__)# type: timing.TimingGroup
这遵循logging
模块的约定。
importlogging_LOG=logging.getLogger(__name__)
任何名称都可以代替__name__
。
但是,如果使用格式为module.sub.subsub
的名称,这将创建一个计时
层次结构,其中每个定时数据存储在其适当的位置,并且可以更容易地查询
生成的_TIME
对象用于创建单个计时器,
并将处理在缓存中存储结果的操作,稍后可用于获取计时统计信息
您可以通过start(name)
方法直接获取计时器对象。
在这种情况下,您需要手动调用stop()
。
timer=_TIME.start('spam')# type: timing.Timingspam()more_spam()timer.stop()
您还可以通过measure(name)
上下文管理器间接获取计时器对象。
上下文管理器将负责在最后调用stop()
with_TIME.measure('ham')astimer:# type: timing.Timingham()more_ham()
如果你想计时同一动作的多次重复(例如,为了统计显著性)
您可以使用measure_many(name[,samples][,threshold])
生成器。
您可以通过samples
参数决定要测量多少次
以及通过threshold
参数最多需要多少秒进行测量
fortimerin_TIME.measure_many('eggs',samples=1000):# type: timing.Timingeggs()more_eggs()fortimerin_TIME.measure_many('bacon',threshold=0.5):# type: timing.Timingbacon()more_bacon()fortimerin_TIME.measure_many('tomatoes',samples=500,threshold=0.5):# type: timing.Timingtomatoes()more_tomatoes()
此外,还可以使用measure
和measure(name)
作为装饰符。
在这种情况下,您不能直接访问计时,但结果将被存储
在计时组对象中,以及在全局缓存中,除非配置计时
不使用缓存。
importtiming_TIME=timing.get_timing_group(__name__)@_TIME.measuredefrecipe():ham()eggs()bacon()@_TIME.measure('the_best_recipe')defbad_recipe():spam()spam()spam()
然后,在调用每个函数之后,可以通过summary
属性访问结果。
recipe()bad_recipe()bad_recipe()assert_TIME.summary['recipe']['samples']==1assert_TIME.summary['the_best_recipe']['samples']==2
第一次访问时动态计算summary
属性。后续访问
不会重新计算值,因此如果需要访问更新的结果,
调用summarize()
方法。
recipe()assert_TIME.summary['recipe']['samples']==1bad_recipe()bad_recipe()assert_TIME.summary['the_best_recipe']['samples']==2# will fail_TIME.summarize()assert_TIME.summary['the_best_recipe']['samples']==2# ok
进一步的api和文档正在开发中。
请参阅examples.ipynb笔记本中的这些示例。