理解time.clock()和time.time()函数

3
尽管它们已被弃用,而且有比time模块更好的模块(即timeit),但我想知道这两个函数time.clock()time.time()之间的区别。从后者(time.time())开始,它基本上返回从1970年1月1日(如果我没记错的话)以秒为单位经过的时间,通常精度为1秒。到这里很简单。相反,time.clock()仍然让我感到困惑。从文档开始:

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

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

现在在Windows中很明显,它所做的与time.time()相同,只是精度更高。但在Unix/Linux中,我无法理解。我尝试了以下代码:
import time

def procedure():
  time.sleep(2.5)

# measure process time
t0 = time.clock()
procedure()
print(time.clock() - t0, "process time")

我获得了 5.300000000000096e-05秒 的处理时间,这对我来说非常奇怪。

阅读这篇已发布的问题和答案,其中一个回答说:

[...]time.clock()测量当前进程使用的CPU时间。

但我不明白,当前进程在做什么时使用了多少时间?当我在Unix上调用time.clock()时,我得到一个小数,那是什么意思?从??到??进程所消耗的时间?


“Deprecated” 的意思是它们将在未来的版本中被移除,这并不意味着建议不以特定方式使用它们。 - chepner
尝试在一个需要几秒钟计算的函数中放置print(time.clock()),这样做会更有意义。 - Padraic Cunningham
2个回答

5
在多处理系统(如Linux或Windows)中,多个独立的进程依次运行。当一个进程正在运行时,所有其他进程都在等待*。偶尔,正在运行的进程放弃其轮换(有时是合作的,有时被迫停止运行)。然后,另一个进程就会获得运行的机会。
这种进程切换可能每秒发生几十次、几百次甚至上千次。从人类用户的角度来看,所有进程似乎同时运行。但事实上,它们都在轮流运行。
当一个进程调用time.sleep(2.5)时,它宣布放弃当前剩余的轮换,并且在接下来的至少2.5秒内不对任何未来的轮换感兴趣。因此,在接下来的2.5秒内,它不消耗任何处理器时间。
相反,如果这是系统中唯一的进程:
while True:
    i += 1

它永远不会放弃它的轮次;它将使用处理器的100%。

那么,这与time.clock()有什么关系呢?在Linux中,time.clock()返回自进程首次启动以来所取的所有轮次的持续时间之和。这是衡量进程任务难度的一个公正的指标。如果只测量墙钟时间(即time.time()),则您的任务持续时间将取决于多少其他进程正在运行以及它们在做什么。


*此描述适用于单处理器多处理系统。对于多处理器系统(或多核系统),实际上可以同时运行多个进程。无论如何,time.clock()返回已经执行的所有轮次的持续时间之和。


你说得再清楚不过了 :) 在Windows中没有time.clock()的等效函数吗?我的意思是在类Unix系统上可以使用的那种。 - zer0uno
谢谢。我不知道在Windows上是否有Python标准库调用可以返回CPU时间。根据这个问题,等效的Win32 API调用是GetProcessTimes - Robᵩ
2
顺便提一下,我暗示一个进程的 clock() 值从 0 开始增加。至少在 Linux 中,我相信这是正确的。适当的标准(POSIX)指出它从某个任意值开始增加。因此,测量 CPU 时间消耗的安全方法是取 clock() 的起始值和结束值之间的差异。 - Robᵩ
因为你表述得很清楚,我想再问一个问题。根据 time.time() 的文档:“请注意,即使时间总是以浮点数返回,但并非所有系统都提供比1秒更好的精度。” 我该如何查看/了解我的系统或一般系统的精度?先谢谢了。 - zer0uno
@antox,我没有一个好的答案给你。在你的执行环境中尝试几次 print "%.40f"%time.time()。你可能会注意到一些模式,并从中推断出一些信息。 - Robᵩ

0

time.time() 返回一个可以解释为当前日期和时间的值。time.clock() 返回当前进程使用的 CPU 时间量的度量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接