2014-09-10 73 views
1

即使它们已被弃用且存在比time(即timeit)更好的模块,我想知道两个函数time.clock()time.time()之间的差异。了解time.clock()和time.time()

从后者开始(time.time()),它基本上以秒为单位返回从1970年1月1日(如果我没有错的话)流逝的时间,精度通常为1秒。 '直到这里很容易。

相反,time.clock()还是让我感到困惑。 来自文档:

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

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

现在在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这是非常奇怪的我。

阅读this已经张贴问题的答案说:

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

但我无法得到它,当前进程使用的时间在做什么?当我在Unix上拨打time.clock()时,我得到一个浮点数,这意味着在那个瞬间?从过程中消耗的时间多少?至 ??

+0

“弃用”表示它们将在未来的版本中被删除,这与推荐不以特定方式使用时不同。 – chepner 2014-09-10 19:57:23

+0

尝试在需要几秒钟计算的函数中放入一个'print(time.clock())',那么它会更有意义。 – 2014-09-10 20:00:20

回答

3

在多处理系统(如Linux或Windows),几个独立的过程依次在每个运行。当一个进程正在运行时,所有其他进程都在等待*。有时候,跑步过程会放弃(有时会合作,有时会被迫停止跑步)。其他一些流程然后轮到运行。

此过程中开关可能发生数十,数百甚至数千次每秒。从用户的角度来看,所有进程似乎都在同时运行。但事实上,他们都在轮流运行。

当一个进程调用time.sleep(2.5)时,它宣布它放弃了当前回合的剩余部分,并且对于未来至少2.5秒内的任何回合都不感兴趣。所以,接下来的2。5秒钟,它消耗没有处理器时间。

反之,如果这是在系统中唯一的过程:

while True: 
    i += 1 

它绝不会放弃它的转向;它会使用100%的处理器。

那么,这与time.clock()有什么关系?在Linux中,time.clock()返回您的进程自首次启动以来所进行的所有转场的持续时间之和。这是衡量您的流程工作有多难的一个公平标准。如果您只测量挂钟时间(即time.time()),那么您的任务持续时间将取决于正在运行的其他进程数量以及他们正在执行的操作。


*这说明适用于单个处理器多处理系统。对于多处理器系统(或多核系统),许多进程实际上可以同时运行。无论如何,time.clock()都会返回所有转弯的持续时间总和。

+0

你不能更清楚:) 在Windows中不是'time.clock()'的等价物吗?我的意思是,它的工作原理与unix系统一样。 – zer0uno 2014-09-10 20:13:05

+0

谢谢。我不知道是否有一个Python标准库调用返回Windows上的CPU时间。根据[这个问题](http://stackoverflow.com/questions/17432502/how-can-i-measure-cpu-time-and-wall-clock-time-on-both-linux-windows),相当于Win32 API调用是[GetProcessTimes](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683223(v = vs.85).aspx)。 – 2014-09-10 20:16:09

+2

顺便说一句,我暗示进程的'clock()'值从'0'开始并且增加。至少在Linux中,我相信这是真的。适当的标准(POSIX)表示,它从一些任意值开始并增加。因此,测量CPU消耗时间的安全方法是获取'clock()'的开始值和结束值之间的差值。 – 2014-09-10 20:19:37

-1

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