首页 > 解决方案 > 有没有办法对多次执行的代码块进行计时?

问题描述

给定一个函数,如:

do_something_big():
  do_1()
  do_2()
  do_3()

很容易获得do_something_big()运行do_1(). 但假设我有:

for _ in range(100000):
  do_something_big()

有没有简单的方法来获得 100,000do_1的时间?做起来并不难——你只需为每个时间计时并更新一些全局状态以跟踪聚合时间。但是是否已经构建了一个实用程序来为我抽象这个?

标签: pythonpython-3.x

解决方案


我建议使用例如 cProfile。这个包将对代码中的每个函数进行计时,并以一种很好的格式输出:

import cProfile

pr = cProfile.Profile()
pr.enable()

run_your_program_here()

pr.disable()
pr.print_stats(sort='tottime')

最后一行中的 sort 参数将根据您给定的选项对输出进行排序。你可以在这里阅读更多关于它的信息:

ncalls - 函数/方法被调用了多少次(如果相同的函数/方法被递归调用,那么 ncalls 有两个值,例如 120/20,其中第一个是真实的调用次数,而第二个是直接呼叫数)

tottime – 以秒为单位的总时间,不包括其他函数/方法的时间

percall – 执行函数的平均时间(每次调用)

cumtime – 以秒为单位的总时间包括它调用的其他函数的时间

percall – 类似于之前的 percall,但是这个包括网络延迟、线程休眠等……</p>

在您的情况下,我会使用“tottime”并查看 do_1 花了多少时间。


推荐阅读