26.6. timeit — 测量小代码片段的执行时间 — Python 文档
26.6. 时间 — 测量小代码片段的执行时间
2.3 版中的新功能。
该模块提供了一种简单的方法来计时一小段 Python 代码。 它既有 命令行接口 ,也有 可调用 接口。 它避免了许多用于测量执行时间的常见陷阱。 另请参阅 O'Reilly 出版的 Python Cookbook 中 Tim Peters 对“算法”一章的介绍。
26.6.1. 基本示例
以下示例显示了如何使用 命令行界面 来比较三种不同的表达式:
这可以通过 Python 接口 实现:
但是请注意,只有在使用命令行界面时,timeit 才会自动确定重复次数。 在 示例 部分,您可以找到更高级的示例。
26.6.2. Python接口
该模块定义了三个便利函数和一个公共类:
- timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)
使用给定的语句、setup 代码和 timer 函数创建一个 Timer 实例,并使用 编号运行其 timeit() 方法 处决。
2.6 版中的新功能。
- timeit.repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)
使用给定的语句、setup 代码和 timer 函数创建一个 Timer 实例,并使用给定的 运行其 repeat() 方法]repeat 计数和 number 次执行。
2.6 版中的新功能。
- timeit.default_timer()
- 以特定于平台的方式定义默认计时器。 在 Windows 上,time.clock() 的粒度为微秒,但 time.time() 的粒度为 1/60 秒。 在 Unix 上,time.clock() 具有 1/100 秒的粒度,而 time.time() 精确得多。 在任一平台上,default_timer() 测量挂钟时间,而不是 CPU 时间。 这意味着在同一台计算机上运行的其他进程可能会干扰计时。
- class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
用于计时小代码片段执行速度的类。
构造函数接受一个要计时的语句、一个用于设置的附加语句和一个计时器函数。 两个语句都默认为
'pass'
; 计时器功能是平台相关的(请参阅模块文档字符串)。 stmt 和 setup 也可以包含由;
或换行符分隔的多个语句,只要它们不包含多行字符串文字。要测量第一条语句的执行时间,请使用 timeit() 方法。 repeat() 方法可以方便地多次调用 timeit() 并返回结果列表。
在 2.6 版中更改: stmt 和 setup 参数现在也可以接受无需参数即可调用的对象。 这会将对它们的调用嵌入到一个定时器函数中,然后由 timeit() 执行。 请注意,在这种情况下,由于额外的函数调用,计时开销会稍大一些。
- timeit(number=1000000)
主语句的执行时间为 number 次。 这将执行一次 setup 语句,然后返回多次执行主语句所需的时间,以秒为单位作为浮点数。 参数是循环的次数,默认为一百万。 main 语句、setup 语句和要使用的定时器函数被传递给构造函数。
- repeat(repeat=3, number=1000000)
多次调用 timeit()。
这是一个方便的函数,它重复调用 timeit(),返回结果列表。 第一个参数指定调用 timeit() 的次数。 第二个参数指定 timeit() 的 number 参数。
笔记
从结果向量计算均值和标准差并报告这些是很诱人的。 但是,这不是很有用。 在典型情况下,最低值给出了机器运行给定代码片段的速度的下限; 结果向量中的较高值通常不是由 Python 速度的变化引起的,而是由干扰计时精度的其他进程引起的。 因此,结果的 min() 可能是您应该感兴趣的唯一数字。 之后,您应该查看整个向量并应用常识而不是统计数据。
- print_exc(file=None)
帮助从定时代码打印回溯。
典型用途:
与标准回溯相比的优点是将显示编译模板中的源代码行。 可选的 file 参数指示发送回溯的位置; 它默认为 sys.stderr。
26.6.3. 命令行界面
当从命令行作为程序调用时,使用以下形式:
理解以下选项的地方:
- -n N, --number=N
- 执行“语句”多少次
- -r N, --repeat=N
- 重复计时器多少次(默认为 3)
- -s S, --setup=S
- 最初执行一次的语句(默认
pass
)
- -t, --time
- 使用 time.time()(默认在所有平台上,除了 Windows)
- -c, --clock
- 使用 time.clock()(Windows 上的默认值)
- -v, --verbose
- 打印原始计时结果; 重复以获得更多数字精度
- -h, --help
- 打印一个简短的使用信息并退出
可以通过将每一行指定为单独的语句参数来给出多行语句; 通过将参数括在引号中并使用前导空格,可以使用缩进行。 多个 -s 选项的处理方式类似。
如果未给出 -n,则通过尝试 10 的连续幂直到总时间至少为 0.2 秒来计算合适的循环次数。
default_timer() 测量值可能会受到在同一台机器上运行的其他程序的影响,因此在需要准确计时时最好的做法是重复计时几次并使用最佳时间。 -r 选项对此很有用; 在大多数情况下,默认 3 次重复可能就足够了。 在 Unix 上,您可以使用 time.clock() 来测量 CPU 时间。
笔记
执行 pass 语句有一定的基线开销。 此处的代码不会试图隐藏它,但您应该意识到这一点。 可以通过不带参数调用程序来测量基线开销,并且它可能因 Python 版本而异。 此外,为了将较旧的 Python 版本与 Python 2.3 进行公平比较,您可能希望对旧版本使用 Python 的 -O
选项(请参阅 Optimizations)以避免计时 SET_LINENO
指令。