我对新功能time.perf_counter()
和time.process_time()
提出了一些问题。
对于前者,来自文档:
返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟以测量短持续时间。它确实包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
这是'最高分辨率'所有系统都一样吗?或者它是否总是略有依赖,例如,我们使用linux或windows?
问题来自于阅读time.time()
文档的事实,它说并非所有系统都提供的时间精度高于1秒。'那么他们现在怎么能提供更好更高的分辨率?
关于后者,time.process_time()
:
返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它在整个过程中。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
我不明白,那些'系统时间'和'用户CPU时间'?有什么区别?
答案 0 :(得分:53)
在这种情况下,有两种不同类型的'时间':绝对时间和相对时间。
绝对时间是'真实世界时间',由time.time()
返回,我们都习惯用它来处理。它通常是从过去的固定时间点(例如1970年1月1日的00:00:00 UTC的UNIX时期)以至少1秒的分辨率测量的。现代系统通常提供毫秒或微秒的分辨率。它由大多数计算机上的专用硬件维护,RTC(实时时钟)电路通常由电池供电,因此系统可以跟踪上电之间的实时时间。这个“真实世界时间”也可能会根据您的位置(时区)和季节(夏令时)进行修改,或者表示为与UTC的偏移(也称为GMT或Zulu时间)。
其次,有相对时间,由time.perf_counter
和time.process_time
返回。这种类型的时间与现实世界时间没有明确的关系,因为这种关系是系统和实现特定的。它只能用于测量时间间隔,即无单位值,它与两个瞬间之间经过的时间成比例。这主要用于评估相对性能(例如,此版本的代码是否比该代码版本运行得更快)。
在现代系统中,使用CPU计数器进行测量,该CPU计数器以与CPU硬件时钟相关的频率单调增加。计数器分辨率高度依赖于系统的硬件,在大多数情况下,该值无法与现实世界时间可靠地相关,甚至在系统之间进行比较。此外,每次CPU上电或复位时,计数器值都会复位。
time.perf_counter
返回计数器的绝对值。 time.process_time
是一个从CPU计数器派生的值,但仅在给定进程在CPU上运行时才更新,并且可以分解为“用户时间”,这是进程本身在运行时的时间。 CPU和'系统时间',即操作系统内核代表进程在CPU上运行的时间。