【问题标题】:Understanding time.perf_counter() and time.process_time()了解 time.perf_counter() 和 time.process_time()
【发布时间】:2014-11-05 06:32:27
【问题描述】:

我对@9​​87654323@ 和time.process_time() 的新功能有一些疑问。

对于前者,来自文档:

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

这种“最高分辨率”在所有系统上都相同吗?或者它总是稍微取决于,例如,我们使用的是 linux 还是 windows?
问题来自阅读time.time() 的文档,它说“并非所有系统都提供比 1 秒更精确的时间”,那么它们现在如何提供更好和更高的分辨率?

关于后者,time.process_time()

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

我不明白,那些“系统时间”和“用户 CPU 时间”是什么?有什么区别?

【问题讨论】:

  • 更多的是duck 按功能而不是实现来使用时间。即,根据您的需要使用time.time()time.monotonic()
  • 请参阅this comment,了解一个进程使用的所有内核如何在time.clocktime.process_time 中求和,但子进程不是。另见this discussion of precision(当然,因系统而异)。

标签: python python-3.x


【解决方案1】:

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

绝对时间是“真实世界时间”,由time.time() 返回,我们都习惯于处理。它通常以至少 1 秒的分辨率从过去的固定时间点(例如 1970 年 1 月 1 日 00:00:00 UTC 的 UNIX 纪元)测量。现代系统通常提供毫秒或微秒的分辨率。它由大多数计算机上的专用硬件维护,RTC(实时时钟)电路通常由电池供电,因此系统在上电之间保持实时跟踪。这个“现实世界时间”也会根据您的位置(时区)和季节(夏令时)进行修改,或者表示为与 UTC 的偏移量(也称为 GMT 或祖鲁时间)。

其次,还有相对时间,由time.perf_countertime.process_time返回。这种类型的时间与现实世界的时间没有明确的关系,因为这种关系是特定于系统和实现的。它只能用于测量时间间隔,即与两个瞬间之间经过的时间成比例的无单位值。这主要用于评估相对性能(例如,这个版本的代码是否比那个版本的代码运行得更快)。

在现代系统上,它是使用 CPU 计数器测量的,该计数器以与 CPU 硬件时钟相关的频率单调增加。计数器分辨率高度依赖于系统的硬件,在大多数情况下,该值无法可靠地与实际时间相关,甚至无法在系统之间进行比较。此外,每次 CPU 上电或复位时,计数器值都会复位。

time.perf_counter 返回计数器的绝对值。 time.process_time 是从 CPU 计数器派生的值,但仅在给定进程在 CPU 上运行时更新,并且可以分解为“用户时间”,即进程本身在 CPU 上运行的时间,和“系统时间”,即操作系统内核代表进程在 CPU 上运行的时间。

【讨论】:

  • 实时以固定速率运行,CPU 时钟变化很大。使用 CPU 时钟来测量代码性能可提供最佳分辨率(直至指令规模)。将 CPU 时钟限制为实时的固定细分会毫无意义地限制该精度。
  • 操作系统如何知道 CPU 频率?关于 CPU 低功耗状态?谁相信多核系统? CPU断电时会发生什么?当拥有一个专用的电池供电实时时钟电路如此简单时,管理起来是一项如此艰巨的任务。
  • @isedev:从您的回答中,我了解到 time.perf_counter 和 time.process_time 是无单位的,但文档说它们是以小数秒为单位测量的。这意味着它们可以用来测量现实世界单位的时间间隔,对吧?
  • 没有人提到关于 time.time() 的一个重要而烦人的细节:它不是单调的。在您的计算机通过互联网重新同步其时钟后,它产生的时间戳迟早会倒退。它也受到闰秒的影响,并且在闰秒发生的极少数情况下可以提前或落后一秒,每 18 个月左右一次。
  • “这种类型的时间与现实世界的时间没有明确的关系......一个无单位的价值......” - 请原谅我的好奇,但为什么呢?在文档中字面意思是返回值是小数秒。
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2021-02-04
  • 2012-02-27
  • 2014-07-28
  • 2017-09-05
  • 2021-02-11
相关资源
最近更新 更多