Вла*_*ков 5 python optimization performance time
上下文:我正在 Python 项目中实现带有 TTL 的内存缓存,它必须承受相当大的吞吐量。为了确定缓存记录何时过时,我将其保存为时间戳,当我稍后检索它时,我会根据当前时间检查该时间戳。如果差异高于阈值,则记录已过时,应被丢弃。
\n问题:time.time()或者time.perf_counter()\xe2\x80\x94\xc2\xa0哪个函数返回值更快?差异是相当大还是可以忽略不计?
Tal*_*dar 18
time.time()和之间的选择time.perf_counter()取决于您将使用该函数的上下文。这是因为每个函数处理不同的“时间类型”。
time.time()处理绝对时间,即“现实世界时间”(我们习惯的时间类型)。它是从过去的固定点开始测量的。根据文档,time.time()返回:
(...) 自纪元以来的时间(以秒为单位),以浮点数表示。
time.perf_counter()另一方面,处理相对时间,它与现实世界时间没有明确的关系(即,这种关系对我们来说是未知的,并且取决于几个因素)。它是使用 CPU 计数器进行测量的,并且根据文档中的指定,只能用于测量时间间隔:
返回值的参考点未定义,因此只有连续调用结果之间的差异才有效。
因此,time.perf_counter()主要用于比较性能。
也就是说,我认为比较这两个函数的速度没有任何意义。它们被设计用于不同的用途 - 您应该选择最适合您的用例的一个。引用@Martijn Pieters 的评论:
有时您需要锤子,有时您需要螺丝刀。你不会问哪个更快,而是问哪个更快。你要么有一颗钉子,要么有一颗螺丝。尝试使用螺丝刀钉钉子可能有用,但不是最佳选择。
根据我从您的评论中收集到的信息,您可能最好使用time.perf_counter(),因为您的重点是相对时间而不是“现实世界时间”。在这样的上下文中,time.perf_counter()可能会更精确,因为它使用:
(...) 具有最高可用分辨率的时钟,用于测量较短的持续时间。
Wiz*_*eek 10
两者time的perf_counter性能相同,无法得出哪个更快的结论,并且在所有平台上都有可靠的统计结果,请在得出结论之前在您的目标平台上自行运行基准测试
以下是在您的计算机上重现相同内容的命令
python -m timeit -s "from time import perf_counter as time" -n 10000000 "time()"
python -m timeit -s "from time import time" -n 10000000 "time()"
Run Code Online (Sandbox Code Playgroud)
性能计数器:
python -m timeit -s "from time import perf_counter as time" -n 10000000 "time()"
python -m timeit -s "from time import time" -n 10000000 "time()"
Run Code Online (Sandbox Code Playgroud)
时间:
10000000 loops, best of 5: 69.6 nsec per loop
10000000 loops, best of 5: 75.9 nsec per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11169 次 |
| 最近记录: |