了解time.perf_counter()和time.process_time()

zer*_*uno 55 python python-3.x

我对新功能的一些问题time.perf_counter()time.process_time().

对于前者,来自文档:

返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟,以测量短持续时间.它确实包括睡眠期间经过的时间,并且是系统范围的.返回值的参考点未定义,因此只有连续调用结果之间的差异才有效.

所有系统上的"最高分辨率"是否相同?或者它是否总是略有依赖,例如,我们使用linux或Windows?
问题来自于阅读time.time()它的文档说"并非所有系统都提供比1秒更好的精度",那么它们如何能够提供更好更高的分辨率呢?

关于后者,time.process_time():

返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位).它不包括睡眠期间经过的时间.根据定义,它在整个过程中.返回值的参考点未定义,因此只有连续调用结果之间的差异才有效.

我不明白,那些'系统时间'和'用户CPU时间'是什么?有什么不同?

ise*_*dev 69

在这种情况下,"时间"有两种不同的类型:绝对时间和相对时间.

绝对时间是'真实世界时间',它由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上运行的时间,以及'系统time',即操作系统内核代表进程在CPU上运行的时间.

  • “这种类型的时间与现实世界的时间没有明确的关系......没有单位的值......” - 请原谅我的好奇心,但为什么呢?文档中确实指出返回值是秒的小数部分。 (4认同)
  • 操作系统如何知道CPU频率?关于CPU低功耗状态?谁相信多核系统?当CPU断电时会发生什么?管理这是一项艰巨的任务,当拥有专用的电池电源时,实时时钟电路非常简单. (3认同)
  • 实时以固定速率运行,CPU时钟变化很大.使用CPU时钟测量代码性能可提供最佳分辨率(低至指令范围).将CPU时钟限制为实时的固定细分限制了该精度毫无意义. (2认同)
  • @antox:为了更好地理解,[阅读本文](https://www.python.org/dev/peps/pep-0418/#glossary) (2认同)
  • @isedev:从你的回答中我了解到 time.perf_counter 和 time.process_time 是无单位的,但文档说它们以小数秒为单位进行测量。这意味着它们可以用来测量现实世界单位的时间间隔,对吧? (2认同)
  • 然而,在适当的参考系(例如执行过程)内,它可以用正常时间单位表示并被认为是线性连续时间。 (2认同)