理解time.clock()和time.time()
虽然这两个函数已经不推荐使用了,而且有更好的模块可以替代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 seconds process time
,这让我觉得很奇怪。
我看到一个已经发布的问题的回答说:
[...] time.clock()测量的是当前进程使用的CPU时间。
但我还是不明白,当前进程在做什么时消耗的时间?当我在Unix上调用time.clock()
时,得到的浮点数代表什么?这个时间是从??到??消耗的?
2 个回答
time.time()
这个函数会给你一个值,这个值可以理解为现在的日期和时间。而 time.clock()
这个函数则会告诉你当前程序使用了多少 CPU 时间,也就是计算机处理这个程序花了多少时间。
在一个多进程的系统中(比如Linux或Windows),有几个独立的进程会轮流运行。当一个进程在运行的时候,其他的进程都在等待。偶尔,正在运行的进程会放弃它的执行机会(有时候是主动放弃,有时候是被迫停止)。然后,其他的进程就可以轮到它们运行了。
这种进程切换可以在每秒发生几十次、几百次甚至几千次。从用户的角度来看,所有的进程似乎是同时在运行,但实际上它们都是轮流进行的。
当一个进程调用 time.sleep(2.5)
时,它表示它放弃了当前的执行机会,并且在接下来的2.5秒内不想再执行任何任务。所以,在接下来的2.5秒里,它不会占用任何处理器的时间。
相反,如果这是系统中唯一的进程:
while True:
i += 1
它就不会放弃它的执行机会;它会使用100%的处理器时间。
那么,这和 time.clock()
有什么关系呢?在Linux中,time.clock()
会返回自进程启动以来,它所占用的所有执行时间的总和。这是衡量你的进程任务难度的一个合理标准。如果你只测量实际的时间(也就是 time.time()
),那么你的任务持续时间就会受到其他正在运行的进程和它们在做什么的影响。
* 这个描述适用于单处理器的多进程系统。在多处理器系统(或多核系统)中,多个进程实际上可以同时运行。不过,无论如何,time.clock()
返回的都是所有执行时间的总和。