如何使用 bash 内置的"时间"捕获 Python 变量中的挂钟时间和 CPU 时间?



我正在开发一个将在命令行中运行的Python脚本。这个想法是从用户那里获取命令,运行它,然后提供用户提供的命令的挂钟时间和 CPU 时间。请参阅下面的代码。

#!/usr/bin/env python 
import os
import sys
def execut_cmd(cmd_line):
utime = os.system('time '+cmd_line)
# Here I would like to store the wall-clock time in the Python variable 
# utime.
cputime = os.system('time '+cmd_line)
# Here the CPU time in the cputime variable. utime and cputime are going to 
# be used later in my Python script. In addition, I would like to silence the 
# output of time in the screen.
execut_cmd(sys.argv[1]) 
print ('Your command wall-clock time is '+utime)
print ('Your command cpu time is '+ cputime)

我怎样才能做到这一点?另外,如果有比使用"时间"更好的方法,我愿意尝试。

来自 Python 文档的挂断时间:

。在 Windows 上,time.clock() 具有微秒粒度,但 time.time() 的粒度是 1/60 秒。在Unix上,time.clock()具有1/100秒的粒度,time.time()要精确得多。在任一平台上,default_timer() 测量挂钟时间,而不是 CPU 时间。这意味着在同一台计算机上运行的其他进程可能会干扰计时。

对于挂墙时间,您可以使用 timeit.default_timer() 获取具有上述最佳粒度的计时器。

从 Python 3.3 及更高版本开始,您可以使用 time.process_time() 或 time.process_time_ns() 。以下是process_time方法的文档条目:

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

为了提供当前的壁时间,可以使用time.time()来获取纪元时间。

为了提供经过的壁时间,可以在操作的开始和结束时使用time.perf_counter(),结果的差异反映了经过的时间。结果不能用于给出绝对时间,因为参考点未定义。如其他答案中所述,您可以使用timeit.default_time()但这始终会返回 python 3.3 的time.perf_counter()

为了提供经过的 CPU 时间,time.process_time()的使用方式与time.perf_counter()类似。这将提供系统和用户 CPU 时间的总和。

由于我在 Linux 系统上使用定时函数所花费的时间很少。我观察到

  1. timeit.default_timer()time.perf_counter()在数值上给出相同的结果。
  2. 此外,在测量时间间隔的持续时间时,timeit.default_timer()time.perf_counter()time.time()实际上都给出了相同的结果。因此,这意味着这些功能中的任何一个都可用于测量任何过程的经过时间或壁时间
  3. 我想我还应该提到,time.time()与其他之间的区别在于,它给出了从1970 年 1 月 1 日凌晨 12:00开始的当前时间(以秒为单位)
  4. time.clock()time.process_time()也给出相同的数值
  5. time.process_time()最适合测量CPU 时间,因为 Python 3 中已经弃用了time.clock()

最新更新