【问题标题】:time.perf_counter() or time.process_time() for performance measurements?time.perf_counter() 或 time.process_time() 用于性能测量?
【发布时间】:2020-09-06 00:58:50
【问题描述】:

我知道 time.perf_counter() 会测量经过的总时间,即使进程当前未运行也是如此。 time.process_time() 但是只测量进程实际运行的时间。

如果我只是衡量一个函数的性能,这两者中的哪一个更受欢迎?

由于我实际上对我的 CPU 用于处理其他进程的时间并不感兴趣,我自然认为 time.process_time() 会是更好的选择(并且在不同的运行中更稳定?),但名称 time.perf_counter( ) 似乎另有说明。

代码示例

import time
from tqdm import trange

start_time_proc = time.process_time()
start_time_perf = time.perf_counter()

tmp = False
for _ in trange(10_000_000):
    tmp = not tmp

elapsed_time_proc = time.process_time() - start_time_proc
elapsed_time_perf = time.perf_counter() - start_time_perf

print("process_time:", elapsed_time_proc)
print("perf_counter:", elapsed_time_perf)

https://repl.it/repls/GigaSpryScientists#main.py

【问题讨论】:

    标签: python


    【解决方案1】:

    通常的测量方法是使用性能计数器并重复测量几次。

    处理时间不经常使用,我可以很容易地告诉你原因:time.sleep(1) 根据处理时间需要 0 秒。每次从调度器中移除进程时,即使是由于正在测试的代码,进程时钟也不会提前。

    我可以建议你看看内置的 timeit 模块吗?它也使用 perf counter,并且可以为重复计时提供更舒适的界面。

    编辑

    当且仅当您的函数完全受 CPU 限制,不访问外部资源,也不引起任何系统调用,process_time 是更准确和更好的选择。

    【讨论】:

    • 这取决于测量目标是什么:如果一个人想要测量真实世界的经过时间,比如秒表,那么你确实想要包括睡眠时间等等——你想知道如何从状态 A 到 B 需要很长时间。在实际性能基准测试中,我们有目的地排除睡眠时间和操作系统调度伪影。 (a) 如果您的程序不执行计算,则它不会影响程序的运行时间,并且 (b) 在集群和云计算机上工作时,sleep 时间可能会超过计算时间 - 该程序仅运行一段时间时间分数,与其他用户共享 CPU
    • 您是完全正确的,但如果您的函数包含与操作系统相关的任何内容,并且依靠操作系统来取消调度进程,那么您的测量在进程时间上将不准确。为了计算它在集群上花费的 CPU 时间,它将是准确的,但如果您的问题是“函数 x 平均需要多长时间运行?”,则处理时间不能回答这个问题。
    • 例如,如果您的函数尝试使用互斥体,或者等待事件直到发生 2 秒的超时。此功能需要的最长持续时间是多少?人们期望的显而易见的答案是 2 秒 + t 的剩余时间 + dt(为了调度的准确性),而在处理时间上,最佳、平均和最差时间都将是“t 的剩余时间”,尽管偏差较小。
    • 好吧,在第一条评论中你有一个观点,而第二条则不适用(因为这暗示了“定时异步事件”之类的东西——使用“定时”或“基准测试”的奇怪术语这里)。实际上,在该设置中存在来自与集群相关的调度程序(如 SLURM 和 SGE)的人工制品,但定义是:process_time 计算该进程不在 sleep() 中的 2 次计时调用之间经过的时间。当然,操作系统是不同的,但在 linux 上,调度是您进程上的外部强制sleep 事件。因此,process_time 摆脱了一些人工制品。
    • 一般的协议是通过应用“大数规则”来最小化调度程序伪影对基准的影响,并多次运行基准函数,并对结果进行平均。此外,测量小部分对那些测量长部分的人工制品更稳健。尽管如此,process_time 已经减少了这些人工制品:用你的函数编写一个小脚本,生成 200 个竞争进程,它们只是对一个变量进行计数,启动进程,运行你的函数,并为两个模块的执行计时。然后你就会看到区别。
    猜你喜欢
    • 2014-11-05
    • 2019-02-12
    • 2021-02-04
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多