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