time精度 - python3 time




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

哪个更适合在Python中进行计时? time.clock()或time.time()? 哪一个提供更高的准确性?

例如:

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

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

Others已经回答了: time.time()time.clock()

但是,如果您计划执行用于基准测试/分析目的的代码块,则应该查看timeit模块


clock() - >浮点数

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

time() - >浮点数

从Epoch开始,以秒为单位返回当前时间。 如果系统时钟提供它们,则可能存在秒级的分数。

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


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

从3.3开始, time.clock()不推荐使用 ,建议使用time.perf_counter()time.perf_counter()代替。

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

time.clock()

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。 精确性,实际上“处理器时间”含义的定义取决于具有相同名称的C函数的精确度,但无论如何, 这是用于基准测试Python或时序算法的函数。

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

此外,还有timeit模块用于基准代码片段。


取决于你在乎的是什么。 如果你的意思是WALL TIME(如墙上的时钟),time.clock()不提供准确性,因为它可能会管理CPU时间。


在Unix上,time.clock()用于度量当前进程使用的CPU时间量,因此从过去的某个时间点开始测量已用时间并不合适。 在Windows上,它将测量自首次调用该函数以来流逝的挂钟时间。 在任何一个系统上,time.time()都会返回自纪元以来的秒数。

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


我使用这段代码来比较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

输出:

时间()= 0.0993799996376

时钟()= 0.0993572257367


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


正如其他人指出的那样, time.clock()不赞成使用time.perf_counter()time.perf_counter() ,但Python 3.7引入了纳秒分辨率,包括time.perf_counter_ns()time.perf_counter_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模块来计时函数和小代码片段。


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

但如果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 ,如果不存储第一个/最后一个值,则不能继续计数。 无法合并另一个计数器...


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

注意:无论使用哪种方法,时间将取决于您无法控制的因素(流程何时切换,频率...),这会随着time.time()而变得更糟,但也存在time.clock() ,所以你不应该只运行一次时间测试,而是总是进行一系列的测试并观察时间的均值/方差。


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

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

time()以UTC的形式返回自纪元以来的秒数,作为浮点数。 不能保证你会得到1秒更好的精度(即使time()返回一个浮点数)。 还要注意,如果系统时钟已经在两次对该函数的调用之间回退,则第二次函数调用将返回一个较低的值。





time