it-swarm.cn

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

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

例如:

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

vs.

start = time.time()
... do something
elapsed = (time.time() - start)
406
Corey Goldberg

从3.3开始, time.clock()不推荐使用 ,建议使用time.process_time()time。 perf_counter()而不是。

以前在2.7中,根据时间模块docs

time.clock()

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度,但在任何情况下, 这是用于基准测试Python或定时算法的函数。

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

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

144
Jason Navarrete

简短的回答是:大部分时间time.clock()会更好。但是,如果你正在计算一些硬件(例如你放在GPU中的一些算法),那么time.clock()将摆脱这个时间,time.time()是唯一的解决方案。

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

45
PierreBdR

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

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

24
dF.

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

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

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

19
Seba

clock() - >浮点数

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

time() - >浮点数

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

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

18
Vinko Vrsalovic

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

17
user15910

因为我自己的practice. time()比Linux上的clock()具有更好的精度。 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

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
13
bestwolf1983

差异非常特定于平台。

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

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

6
Justin Sheehy

在Unix上,time.clock()测量当前进程使用的CPU时间量,因此从过去的某个点开始测量经过的时间是没有用的。在Windows上,它将测量自第一次调用函数以来经过的挂钟时间。在任一系统上,time.time()将返回自Epoch以来经过的秒数。

如果您正在编写仅适用于Windows的代码,则两者都可以工作(尽管您将使用两者不同 - time.clock()不需要减法)。如果要在Unix系统上运行,或者您希望保证可移植的代码,则需要使用time.time()。

3
auspace

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

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

time()以UTC为单位返回自纪元以来的秒数,作为浮点数。无法保证您在1秒内获得更好的精度(即使time()返回浮点数)。另请注意,如果系统时钟已在两次调用此函数之间设置,则第二次函数调用将返回较低的值。

2
Babak

我用这段代码来比较两种方法。我的OS是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

2
Nurul Akter Towhid

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

2
Jake

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

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

1
dsgdfg

正如其他人所说的那样time.clock()被弃用而不赞成time.perf_counter()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模块 来计算时间函数和小代码片段。

1
Chris_Rands