Python time.time vs.timeit.timeit

Python time.time vs.timeit.timeit,python,performance,time,python-3.x,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): p

有时,我喜欢计算部分代码运行所需的时间。我查阅了很多在线网站,大体上看到了两种主要的方法。一个是使用
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))
基本上,它是在for循环中打印100次“ABC”所需时间的倍。左边的数字是
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

正如你所看到的,有时时间更快,有时更慢。哪种方法更准确?

timeit
更准确,原因有三:

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

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

使用Python2.x和或Python3.x可以生成更可靠的结果,它们测量代码执行期间使用的CPU周期,但即使是这种方法,因为它严重依赖于执行测试的特定机器。例如,如果在不同的机器上执行测试,结果可能会大不相同(即使算法和输入数据都完全相同)



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

timeit
是对代码块计时的更好选择。它使用
time.time()
time.clock()
用于Windows)并禁用垃圾收集器。另外,一次试用也是不够的。@Blender:
timeit
在Python 3.3+@J.F.Sebastian中使用
time.perf\u counter
。谢谢,我不知道。如果你明确地做了这三件事,你会得到和timeit一样准确的结果吗?我的用例是用不同的输入运行许多测试,所以我想省去timeit可能更容易。@Annan:为什么要重新发明这个轮子?我确信,只要您理解重复运行某些东西意味着什么,无论您能想出什么用例,都可以由
timeit
提供。有一些较小的小技巧
timeit
使用(例如使用
itertools.repeat(无,repeatiationcount)
用于低摩擦重复范围)如果你想像
timeit
那样“准确”,你也必须复制它。@MartijnPieters:我想知道
%timeit
是否是
timeit
的内置魔法命令,那么
%time
怎么样。当我们使用
time.clock()
时,
%time
是否相同(将2 time.clock放在代码的开头和结尾,并计算时间差)。我在这里读过,但没有足够的信息。Thanks@Catbuilts:这是一个,但不多。@amsquareb:安装程序块只运行一次,让您为重复测试创建正确的对象(上下文)。