time.perf_counter() 和 time.process_time() 有啥区别?

Posted

技术标签:

【中文标题】time.perf_counter() 和 time.process_time() 有啥区别?【英文标题】:what is the difference between time.perf_counter() and time.process_time()?time.perf_counter() 和 time.process_time() 有什么区别? 【发布时间】:2019-02-12 18:36:58 【问题描述】:

我正在使用 Jupyter 笔记本。我正在尝试测量用 python 计算 Avogadro 的数字需要多长时间。我发现time.perf_counter()time.process_time() 模块对这类工作很有用。所以我尝试了这两种方法,但结果完全不同。是什么造成了这种差异?这是我的代码。

import time

a = 10 ** 5

def AvogadroCounting():
    i = 0
    while i <= a:
        i += 1

AvogadroCounting()

t_fract = time.perf_counter()  #time to count fraction of avogadro's number in Seconds


print(t_fract, 'secs')

我的笔记本给出 693920.393636181 秒。

import time

a = 10 ** 5

def AvogadroCounting():
    i = 0
    while i <= a:
        i += 1

AvogadroCounting()

t_fract =  time.process_time()  #time to count fraction of avogadro's number in Seconds


print(t_fract, 'secs')

这给出了 2048.768273 秒。

【问题讨论】:

【参考方案1】:

time.perf_counter() 在睡眠期间会继续运行,time.process_time() 不会。

time.perf_counter() → 浮动

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

time.process_time() → 浮动

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

见official documentation

import time

def pc():
    start = time.perf_counter()
    time.sleep(1)
    print(time.perf_counter()-start)

def pt():
    start = time.process_time()
    time.sleep(1)
    print(time.process_time()-start)

pc()  # 0.99872320449432
pt()  # 0.0

【讨论】:

是的,我实际上在提问之前阅读了文档,但我不知道这两个模块之间的确切区别。也许我不确定“睡眠”的含义......【参考方案2】:

perf_counter() 应该测量一个进程所花费的实际时间,就像您使用秒表一样。

process_time() 将给出计算机在当前进程上花费的时间,具有操作系统的计算机通常不会在任何给定进程上花费 100% 的时间。这个计数器不应该计算 CPU 运行其他任何东西的时间。

大多数情况下 perf_counter 可能更可取,但如果您想比较代码效率,则 process_time 会很有用。

【讨论】:

虽然总的来说这是一个不错的建议,但在这种情况下,我认为答案比公认的要好得多。它对秒表和单任务计算机的比喻真的很有帮助。

以上是关于time.perf_counter() 和 time.process_time() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Python time.perf_counter 进程间零时间同步;操作系统一致?

计算程序运行时间

模拟进度条

python线程池和进程池的多参数调用

分享几个小程序

Python基本数据类型-文本进度条