ChatGPT解决这个技术问题 Extra ChatGPT

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

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

例如:

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

对比

start = time.time()
... do something
elapsed = (time.time() - start)
请注意,从 Python 3.3 开始,the use of time.clock() is deprecated,建议改用 perf_counter()process_time()
请参阅 this comment,了解进程使用的所有核心如何在 time.clocktime.process_time 中求和,但子进程不是。另请参阅 this discussion of precision(当然,因系统而异)。

h
haggai_e

从 3.3 开始,time.clock() is deprecated,建议改用 time.process_time()time.perf_counter()

根据 time module docs,之前在 2.7 中:

time.clock() 在 Unix 上,以浮点数形式返回当前处理器时间,以秒为单位。精度,实际上是“处理器时间”含义的定义,取决于同名 C 函数的精度,但无论如何,这是用于对 Python 或计时算法进行基准测试的函数。在 Windows 上,此函数根据 Win32 函数 QueryPerformanceCounter() 以浮点数形式返回自第一次调用此函数以来经过的挂钟秒数。分辨率通常优于一微秒。

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


“这是用于对 Python 或计时算法进行基准测试的函数。”
根据此处给出的答案,Python 文档似乎并不准确。 time.clock() 并不总是您想要的基准测试。尤其是存在 timeit 模块
@Corey Goldberg:你也是submit a documentation bug? (他们的意思是“使用 clock() 而不是 time():,但是是的,它很草率)
here 可以看出,time.clock() 的行为似乎依赖于平台,而 time.process_time() 则不然。这就是不推荐使用 time.clock() 的原因。
time.process_time 不包括睡眠时间,根据我的经验,这在尝试对多线程代码或等待 I/O 的代码进行计时可能是个问题。唯一没有这个问题的计时器是time.time,但它更慢。难道没有其他选择包括睡眠时间吗?
E
Engineero

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

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


同样当通过异步方式请求网络资源时(进程将被阻塞等待),网络时间将被摆脱。
E
Engineero

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

但是,如果您要为执行基准测试/分析目的而定时执行代码块,则应该查看 timeit module


+1:根据操作系统将 timeit.default_timer 分配给 time.time()time.clock()。在 Python 3.3+ 上,default_timer 在所有平台上都是 time.perf_counter()
E
Engineero

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

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

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


我在找这个。谢谢 :) 即使用户从操作系统更改时间,它也会对我有所帮助。
如何比较这个时间和用户以小时:分钟格式存储的时间?
E
Engineero

clock() ->浮点数

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

time() ->浮点数

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

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


u
user15910

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


确切地说,我只是在 Linux 服务器上使用了 time.clock(),我得到的数字肯定不是秒
b
bestwolf1983

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

所以我假设葡萄酒的时间()?
C
Chris_Rands

正如其他人所指出的那样,不推荐使用 time.clock() 以支持 time.perf_counter()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 module 对函数和小代码片段进行计时。


J
Justin Sheehy

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

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

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


你能扩展一下,clock"very different" 的哪些方面?
T
Tiago Martins Peres

我使用此代码比较 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

佚名

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

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


x
xjcl

time.clock() 在 Python 3.8 中被删除,因为它有 platform-dependent behavior

在 Unix 上,以浮点数形式返回当前处理器时间,以秒为单位。

在 Windows 上,此函数返回自第一次调用此函数以来经过的挂钟秒数,作为浮点数 print(time.clock()); time.sleep(10); print(time.clock()) # Linux : 0.0382 0.0384 # 查看处理器时间 # Windows: 26.1224 36.1566 # 查看挂钟时间

那么选择哪个功能呢?

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

使用 time.process_time()

挂钟时间:这是指“挂在墙上的时钟”已经过去了多少时间,即在实时之外。使用 time.perf_counter() time.time() 还可以测量挂钟时间,但可以重置,因此您可以及时返回 time.monotonic() 无法重置(单调 = 仅向前)但精度低于时间.perf_counter()

使用 time.perf_counter() time.time() 还可以测量挂钟时间,但可以重置,因此您可以及时返回 time.monotonic() 无法重置(单调 = 仅向前)但精度低于时间.perf_counter()

time.time() 也测量挂钟时间,但可以重置,所以你可以回到过去

time.monotonic() 无法重置(单调 = 仅向前)但精度低于 time.perf_counter()


B
Babak

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

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

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


J
Jake

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


d
dsgdfg

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

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


g
gustafbstrom

比较 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 的区别。