Python的time.clock()和time.time()哪个更准确?

455

在Python中,哪种方法更好用于时间计算?time.clock()还是time.time()?哪一种提供更高的精度?

例如:

start = time.clock()
... do something
elapsed = (time.clock() - start)

对比。

start = time.time()
... do something
elapsed = (time.time() - start)

43
请注意,从Python 3.3开始,使用time.clock()已经弃用,建议使用perf_counter()process_time()代替。 - Cody Piersall
3
即使在Python 2上,你也应该使用timeit.default_timer()来测量性能(它根据操作系统分配给time.time()time.clock())。 - jfs
请参考此评论,了解time.clocktime.process_time如何将进程使用的所有核心相加,但不包括子进程。另请参考这篇关于精度的讨论(当然,这取决于系统)。 - max
16个回答

5

time.clock()在Python 3.8中被移除,因为它具有平台相关的行为

  • On Unix, return the current processor time as a floating point number expressed in seconds.
  • On Windows, this function returns wall-clock seconds elapsed since the first call to this function, as a floating point number

    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux  :  0.0382  0.0384   # see Processor Time
    # Windows: 26.1224 36.1566   # see Wall-Clock Time
    

那么应该选择哪个函数呢?

  • 处理器时间:这是指特定进程在 CPU 上执行活动的时间。睡眠、等待Web请求或仅执行其他进程的时间不会对此产生贡献。

    • 使用 time.process_time()
  • 挂钟时间:这指的是“挂在墙上的时钟”的时间,即现实时间之外的时间。

    • 使用 time.perf_counter()

      • time.time()也测量挂钟时间,但可以重置,因此您可以返回到过去
      • time.monotonic()无法重置(单调=仅向前),但比time.perf_counter()精度低

3
在Unix系统中,time.clock()测量了当前进程使用的CPU时间,因此无法用于测量过去某一点经过的时间。在Windows系统中,它将测量自函数第一次调用以来经过的墙钟秒数。在任何系统上,time.time()都将返回自时代以来经过的秒数。
如果您编写的代码仅用于Windows,则两者都可以使用(尽管您会以不同的方式使用它们-不需要对time.clock()进行减法)。如果这将在Unix系统上运行或者您想要保证代码可移植性,则应使用time.time()。

2
简短回答:在Python中使用time.clock()进行计时。
在*nix系统上,clock()返回处理器时间,以浮点数表示,单位为秒。在Windows上,它返回自第一次调用此函数以来经过的秒数,作为浮点数。
time()以浮点数形式返回自纪元以来的秒数(以UTC为准)。不能保证您会获得比1秒更好的精度(即使time()返回浮点数)。还请注意,如果在两次调用该函数之间将系统时钟设置回,则第二次函数调用将返回较低的值。

2
据我理解,time.clock()的精度取决于系统允许的最高精度。

1

正确答案是:它们的分数长度相同。

但如果subjecttime,哪个更快?

一个小测试用例::

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

我不在瑞士实验室工作,但我已经测试过了。
基于这个问题:time.clock()time.time()更好
编辑:time.clock()是内部计数器,因此不能在外部使用,有最大32位浮点数的限制,如果不存储第一个/最后一个值,则无法继续计数。无法合并另一个计数器...

0

比较Ubuntu Linux和Windows 7之间的测试结果。

在Ubuntu上

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873

在Windows 7上

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5

请阅读其他答案以了解Windows和Unix/Linux之间的区别。 - Corey Goldberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接