【问题标题】:Timing the CPU time of a python program?计时python程序的CPU时间?
【发布时间】:2013-02-17 01:39:25
【问题描述】:

我想为我的代码计时,我只想要 CPU 执行时间(忽略操作系统进程等)。

我试过time.clock(),它看起来太不精确了,每次都给出不同的答案。 (理论上,如果我再次为相同的代码 sn-p 运行它,它应该返回相同的值??)

我已经用 timeit 玩了大约一个小时。对我来说,基本上扼杀它的是“设置”过程,我最终不得不导入大约 20 个函数,这是不切实际的,因为我实际上只是将我的代码重写到设置部分以尝试使用它。

Cprofiles 看起来越来越有吸引力,但它们会返回 CPU 时间吗?还有一个小问题——它输出的信息太多了。有什么方法可以将输出的信息放入 txt 或 .dat 文件中以便我实际阅读?

干杯

操作系统:Ubuntu 程序:python 2.7

【问题讨论】:

  • 请注意,每次运行都会得到不同的时间,即使您想计算仅由您的进程占用的 cpu 周期。这是因为 CPU 缓存,每次最终都会处于不同的状态(具有不同的地址空间部分)。 CPU 缓存在进程之间共享,因此您不能保证例如每次运行代码时,某个变量都会保存在缓存中。
  • resource.getrusage 可用于获取python 2.7中的处理时间

标签: python time cpu profile execution


【解决方案1】:

听起来您正在寻找一种方法来计时进程范围的执行时间,您可以做的最好的事情是使用timeit.default_timer(),它提供了最精确的 time.clock() 或time.time() 函数在当前平台上可用,但它是系统范围时间,这意味着其他进程可能会干扰您的测量。

这是来自 timeit.default_timer() 文档的信息:

以特定于平台的方式定义默认计时器。在 Windows 上, time.clock() 具有微秒粒度,但 time.time() 的 粒度为 1/60 秒。在 Unix 上,time.clock() 有 1/100 第二个粒度,time.time() 更精确。在 任一平台,default_timer() 测量挂钟时间,而不是 CPU 时间。这意味着在同一台计算机上运行的其他进程可能 干扰时间。

您应该尝试测试可能访问不同时间 API 的 c 模块。


最好的方法是使用 time.process_time(),它只在 python 3.3 及更高版本中可用,以下是文档中的信息:

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

【讨论】:

【解决方案2】:

timeit.default_timer()代替time.clock();它为您的平台使用最准确的选项。例如,对于 Ubuntu,这将使用 time.time()

使用timeit 时,创建一个设置函数,然后您可以将其重新用于timeit。是的,这看起来有点工作,但它可以确保您对真正想要测量的内容进行计时,并且不会在时间关键的测量部分中包含设置代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2020-12-06
    相关资源
    最近更新 更多