449

在 Python 中哪个更适合用于计时?time.clock() 还是 time.time()?哪一个提供更高的准确性?

例如:

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

对比

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

16 回答 16

177

从 3.3 开始,time.clock()已弃用,建议使用time.process_time( )time.perf_counter()代替。

根据时间模块文档,以前在 2.7 中:

时间.时钟()

在 Unix 上,以浮点数形式返回当前处理器时间,以秒为单位。精度,实际上是“处理器时间”含义的定义,取决于同名 C 函数的精度,但无论如何,这是用于对 Python 或计时算法进行基准测试的函数。

在 Windows 上,此函数根据 Win32 函数 QueryPerformanceCounter() 以浮点数形式返回自第一次调用此函数以来经过的挂钟秒数。分辨率通常优于一微秒。

此外,还有用于对代码片段进行基准测试的timeit模块。

于 2008-09-17T17:18:27.427 回答
50

简短的回答是:大多数时候time.clock()会更好。但是,如果您正在计时某些硬件(例如您放入 GPU 中的某些算法),那么time.clock()将摆脱这个时间并且time.time()是唯一剩下的解决方案。

注意:无论使用什么方法,时间都将取决于您无法控制的因素(进程何时切换,多久切换一次,...),这更糟糕,time.time()但也存在于time.clock(),所以你不应该只运行一个时间测试,但总是进行一系列测试并查看时间的均值/方差。

于 2008-09-17T17:16:00.600 回答
25

其他人已经回答了:time.time()vs time.clock().。

但是,如果您正在计时执行代码块以进行基准测试/分析,您应该查看timeit模块

于 2008-09-17T17:18:56.613 回答
20

clock()-> 浮点数

返回自进程开始或自第一次调用以来的 CPU 时间或实时时间clock()。这与系统记录的精度一样高。

time()-> 浮点数

返回自 Epoch 以来的当前时间(以秒为单位)。如果系统时钟提供它们,则可能存在几分之一秒。

通常time()更精确,因为操作系统不会以它们存储系统时间(即实际时间)的精度存储进程运行时间

于 2008-09-17T17:14:08.030 回答
20

要记住的一件事:更改系统时间会影响time.time()但不会影响time.clock().

我需要控制一些自动测试执行。如果测试用例的一个步骤花费了超过给定的时间,则该 TC 将被中止以继续下一个步骤。

但有时需要一个步骤来改变系统时间(检查被测应用的调度器模块),所以在将系统时间设置为未来几个小时后,TC超时到期,测试用例中止。我必须从 to 切换time.time()time.clock()正确处理这个问题。

于 2010-02-11T17:21:26.510 回答
17

取决于你关心什么。如果您指的是 WALL TIME(如墙上时钟上的时间), time.clock() 不会提供任何准确性,因为它可能会管理 CPU 时间。

于 2008-09-17T17:12:29.377 回答
15

time()clock()比在 Linux 上具有更好的精度。clock()仅具有小于 10 ms 的精度。虽然time()给出了完美的精度。我的测试是在 CentOS 6.4, python 2.6

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms
于 2014-01-17T05:21:01.537 回答
10

正如其他人所指出time.clock()的,不推荐使用 time.perf_counter()or time.process_time(),但 Python 3.7 引入了纳秒级分辨率计时,带有time.perf_counter_ns()time.process_time_ns()time.time_ns(),以及 3 个其他函数。

这 6 个新的纳秒分辨率函数在PEP 564中有详细说明:

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

这些函数类似于没有 _ns 后缀的版本,但以 Python int 形式返回纳秒数。

正如其他人也指出的那样,使用该timeit模块对函数和小代码片段进行计时。

于 2018-04-05T08:22:38.453 回答
6

差异是非常特定于平台的。

例如,clock() 在 Windows 上与在 Linux 上非常不同。

对于您描述的那种示例,您可能需要“timeit”模块。

于 2008-09-17T17:32:27.253 回答
5

我使用此代码比较 2 种方法。我的操作系统是 windows 8,处理器核心 i5,RAM 4GB

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

输出:

time() = 0.0993799996376

clock() = 0.0993572257367
于 2016-03-11T00:15:17.457 回答
3

在 Unix 上 time.clock() 测量当前进程已使用的 CPU 时间量,因此它不适用于测量过去某个时间点的经过时间。在 Windows 上,它将测量自第一次调用该函数以来经过的挂钟秒数。在任一系统上 time.time() 将返回自纪元以来经过的秒数。

如果您正在编写仅适用于 Windows 的代码,那么任何一个都可以工作(尽管您会以不同的方式使用这两者 - time.clock() 不需要减法)。如果这要在 Unix 系统上运行,或者您想要保证可移植的代码,您将需要使用 time.time()。

于 2008-09-17T17:24:37.927 回答
2

据我所知, time.clock() 的精度与您的系统允许的一样高。

于 2008-09-17T20:03:49.370 回答
2

简短的回答:在 Python 中使用time.clock()进行计时。

在 *nix 系统上,clock() 以浮点数的形式返回处理器时间,以秒为单位。在 Windows 上,它返回自第一次调用此函数以来经过的秒数,作为浮点数。

time() 以浮点数形式返回纪元以来的秒数,以 UTC 表示。无法保证您将获得比 1 秒更好的精度(即使 time() 返回一个浮点数)。另请注意,如果系统时钟在两次调用此函数之间已调回,则第二次函数调用将返回较低的值。

于 2008-09-17T17:17:57.880 回答
2

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

  • Unix上,以浮点数形式返回当前处理器时间,以秒为单位。
  • Windows上,此函数返回自第一次调用此函数以来经过的挂钟秒数,作为浮点数

    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()
于 2020-05-31T11:41:32.343 回答
1

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

subject但是 if哪个更快time

一个小测试用例

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()是内部计数器,因此不能在外部使用,有限制max 32BIT FLOAT,如果不存储第一个/最后一个值,则无法继续计数。无法合并另一个计数器...

于 2016-11-18T12:27:06.263 回答
-1

比较 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
于 2014-01-27T06:13:18.820 回答