Python的time.clock()与time.time()的准确性?

Cor*_*erg 416 python time

哪个更适合用于Python中的计时?time.clock()或time.time()?哪一个提供更准确?

例如:

start = time.clock()
... do something
elapsed = (time.clock() - start)
Run Code Online (Sandbox Code Playgroud)

start = time.time()
... do something
elapsed = (time.time() - start)
Run Code Online (Sandbox Code Playgroud)

Jas*_*ete 154

作为3.3,time.clock()已被弃用,并且它建议使用time.process_time()time.perf_counter()来代替.

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

time.clock()

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

在Windows上,此函数返回自第一次调用此函数以来经过的挂钟秒,作为浮点数,基于Win32函数QueryPerformanceCounter().分辨率通常优于1微秒.

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

  • "这是用于对Python或计时算法进行基准测试的函数."<br>根据此处给出的答案,Python文档似乎不准确.time.clock()并不总是你想要的基准测试.特别是存在timeit模块 (4认同)
  • @smci:[Python bug:删除time.clock()docs中过时的注释](http://bugs.python.org/issue22749) (2认同)
  • 可以阅读[这里](https://docs.python.org/3/library/time.html#time.clock)似乎`time.clock()`的行为在平台上是依赖的,并且` time.process_time()`不是.这就是为什么`time.clock()`被弃用的原因. (2认同)

Pie*_*BdR 45

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

注意:无论使用哪种方法,时间都取决于你无法控制的因素(进程何时切换,频率,......),这种情况会更糟,time.time()但也存在time.clock(),所以你不应该只进行一次计时测试,但总是进行一系列的测试,看看时间的均值/方差.


dF.*_*dF. 25

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

但是,如果您为执行基准测试/分析目的而执行一段代码,则应该查看该timeit模块.

  • +1:[`timeit.default_timer`](http://docs.python.org/2/library/timeit.html#timeit.default_timer)被分配给`time.time()`或`time.clock() `取决于操作系统.在Python 3.3+ [`default_timer`](http://docs.python.org/3/library/timeit#timeit.default_timer)上是[`time.perf_counter()`](http://docs.python.org /3/library/time.html#time.perf_counter)在所有平台上. (16认同)

小智 19

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

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

但有时需要一个步骤来更改系统时间(检查被测应用程序的调度程序模块),因此在将来几个小时后设置系统时间后,TC超时到期并且测试用例中止.我必须切换time.time()time.clock()正确处理这个问题.


Vin*_*vic 18

clock() - >浮点数

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

time() - >浮点数

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

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


use*_*910 17

取决于你关心的是什么.如果你的意思是WALL TIME(就像你墙上的时钟一样),time.clock()提供NO准确性,因为它可以管理CPU时间.


小智 14

因为我自己time()clock()Linux 更精确.clock()只有精度小于10毫秒.虽然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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Chr*_*nds 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 个函数。

PEP 564中详细介绍了这 6 个新的纳秒分辨率函数:

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模块对函数和小代码片段进行计时。


Jus*_*ehy 6

差异非常特定于平台.

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

对于您描述的那种示例,您可能需要"timeit"模块.

  • 你能扩展,以什么方式`时钟`是"非常不同"`? (3认同)

Nur*_*hid 5

我用这个代码来比较两种方法。我的操作系统是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
Run Code Online (Sandbox Code Playgroud)

输出:

time() = 0.0993799996376

clock() = 0.0993572257367
Run Code Online (Sandbox Code Playgroud)


xjc*_*jcl 5

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
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 处理器时间:这是该特定进程在 CPU 上主动执行所花费的时间。睡眠、等待网络请求或仅执行其他进程的时间不会对此产生影响。

    • 使用time.process_time()
  • 挂钟时间:这是指“挂在墙上的时钟”已经过去了多少时间,即超出实际时间。

    • 使用time.perf_counter()

      • time.time()还可以测量挂钟时间,但可以重置,这样您就可以回到过去
      • time.monotonic()无法重置(单调 = 仅前进),但精度低于time.perf_counter()