首页 > 解决方案 > time.time() 或 time.perf_counter() — 哪个更快?

问题描述

上下文:我在我的 Python 项目中使用 TTL 实现内存缓存,它必须承受相当大的吞吐量。为了确定缓存记录何时过时,我将它与时间戳一起保存,当我稍后检索它时,我会根据当前时间检查这个时间戳。如果差值高于阈值,则记录是陈旧的,应该被丢弃。

问题:time.time()或者time.perf_counter()——哪个函数返回值更快?差异是相当大还是可以忽略不计?

标签: pythonperformanceoptimizationtime

解决方案


time.time()和之间的选择time.perf_counter()取决于您将使用该函数的上下文。这是因为每个函数都处理不同的“时间类型”。

time.time()处理绝对时间,即“真实世界时间”(我们习惯的时间类型)。它是从过去的固定点测量的。根据文档time.time()返回:

(...) 自纪元以来的时间(以秒为单位)作为浮点数。

time.perf_counter()另一方面,它处理相对时间,它与现实世界的时间没有明确的关系(即,这种关系对我们来说是未知的,并且取决于几个因素)。它是使用 CPU 计数器测量的,并且如docs中所述,仅应用于测量时间间隔:

返回值的参考点是未定义的,因此只有连续调用的结果之间的差异才有效。

因此,time.perf_counter()主要用于比较性能。


也就是说,我认为比较这两个函数的速度没有任何意义。它们被设计用于不同的事情——你应该选择最适合你用例的那个。引用@Martijn Pieters 的评论:

有时你需要一把锤子,有时你需要一把螺丝刀。您不会问其中一个是否更快;你要么有钉子,要么有螺丝。尝试在钉子上使用螺丝刀可能会奏效,但不是最佳选择。

根据我从您的评论中收集到的信息,您可能最好使用time.perf_counter(),因为您的重点是相对时间而不是“现实世界时间”。在这种情况下,time.perf_counter()可能会更精确,因为它使用:

(...) 具有最高可用分辨率的时钟,用于测量短持续时间。


推荐阅读