time.time vs. timeit.timeit

iCo*_*dez 30 python performance time python-3.x

有时,我喜欢计算运行代码的部分时间.我已经检查了很多在线网站,并且已经看到了两种主要方法.一个是使用time.time,另一个是使用timeit.timeit.

所以,我写了一个非常简单的脚本来比较两者:

from timeit import timeit
from time import time
start = time()
for i in range(100): print('ABC')
print(time()-start, timeit("for i in range(100): print('ABC')", number=1))
Run Code Online (Sandbox Code Playgroud)

基本上,它计算在for循环中打印"ABC"100次所需的时间.左边的数字是结果,time.time右边的数字是timeit.timeit:

# First run
0.0 0.012654680972022981
# Second run
0.031000137329101562 0.012747430190149865
# Another run
0.0 0.011262325239660349
# Another run
0.016000032424926758 0.012740166697164025
# Another run
0.016000032424926758 0.0440628627381413
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,有时候,time.time更快,有时速度更慢.哪种方式更好(更准确)?

Mar*_*ers 51

timeit 更准确,原因有三:

  • 它会多次重复测试,以消除机器上其他任务的影响,例如磁盘刷新和操作系统调度.
  • 它禁用垃圾收集器以防止该进程通过在不合适的时刻安排集合运行来扭曲结果.
  • 它为您的操作系统选择最准确的计时器,time.time或者time.clock在Python 2和time.perf_counter()Python 3中选择最准确的计时器timeit.default_timer.

  • @Annan:为什么重新发明这个轮子?我敢肯定,无论你能想出什么用法,只要你理解了重复运行的意义,就可以通过`timeit`来提供.有一些较小的小技巧`timeit`使用(例如使用`itertools.repeat(None,repetitioncount)`用于低摩擦重复范围),如果你想要'准确',你也必须复制它们.当'timeit`得到. (6认同)
  • @Catbuilts:它[比这更复杂](https://github.com/ipython/ipython/blob/0fbad83245f474c4dd7a1b1fbe7f2ea79e005653/IPython/core/magics/execution.py#L1226-L1244),但不多。 (2认同)

Gio*_*ous 6

在任何给定时间,中央处理单元 (CPU) 都会被许多进程使用和共享。使用的测量结果与我们所说的挂钟time.time有关。这意味着结果取决于执行测试时正在运行的其他进程。因此,在许多情况下,产生的结果并不尽可能准确。time.time

time.clock使用Python 2.x 和 time.process_time()/或Python 3.X可以生成更可靠的结果time.perf_counter(),这些结果测量代码执行期间使用的 CPU 周期,但即使是这种方法,因为它严重依赖于您正在执行测试的特定机器。例如,如果测试在不同的机器上执行,结果可能会有很大差异(即使算法和输入数据完全相同)


timeit.timeit是一个先进的库,相比之下更加准确和可靠,time.time因为time.clock它考虑了造成代码执行和试验之间差异的因素,通过简单地重复执行测试来产生更可靠和准确的结果。+