如何从Python中使用bash的时间函数?

2 投票
2 回答
2773 浏览
提问于 2025-04-15 12:27

我想用Python来调用系统程序并测量它们的运行时间。在Linux命令行中,如果你输入:

$ time prog args

你会得到类似这样的结果:

real    0m0.110s
user    0m0.060s
sys     0m0.024s

如果你输入'man time',它会告诉你可以输入:

$ time -f "%E" prog args

这样可以格式化输出,只显示经过的时间。但在命令行中这样做并不奏效。我认为这是因为bash有自己的时间函数。如果你输入:

$/usr/bin/time -f "%E" prog args

你会得到手册页中所说的预期输出。

我想要bash的时间,因为它似乎更准确。我的问题是,当你尝试从Python中使用'time prog args'命令时,它的表现和你直接输入时不一样。

下面是我正在做的代码(请原谅我的代码有点乱):

#!/usr/bin/env python
"""Quick & Dirty script to time program execution for multiple inputs.
Saves the results as a .csv for importing into excel."""
import subprocess
timing = 'time -f "%E" '
program = 'java smartfib '
filename = 'smarttimes.csv'
#arglist = [0, 10, 20, 30, 31, 32, 33, 34, 35]
#arglist = [0, 2, 3, 5]
arglist = range(50)
timelist = list()

#run the program with the specified input values
for arg in arglist:

    cmd = timing + program + str(arg)
    pipe = subprocess.Popen(cmd, shell = True, bufsize = 256,
                stderr = subprocess.PIPE, stdout = subprocess.PIPE)

    [answer,times] = pipe.communicate() #read from pipe
    #print times
    if(int(answer) < 0):
        print "overflow occured at fib(%d)!\n" %arg
        break
    #save (n, [time it takes to complete] as a tuple in a list)
    timelist.append([arg,times])


csv = list() #list for formatted comma separated values for excel
for item in range(len(timelist)):
    csv.append(
        str(timelist[item][0]) + "," + timelist[item][1][2:].strip('\n')
        )

results = file(filename,'w')
results.write('n,time(in s)\n')
for item in range(len(csv)):
    results.write(csv[item]+'\n')

results.close()

def getTimeInSeconds(self, timestring):
    pass

2 个回答

0

我觉得时间的准确性不会比Python的方法更高,除非你在2.5.3版本之前使用os.times(),并查看用户时间,因为早期版本的Python在这方面有很大的差异。

虽然time命令的表现和bash里的time命令不太一样,但它们都能返回相关的信息,所以我其实不太明白问题出在哪里。

2

你说得对,bash有自己版本的时间命令。

$ type time
time is a shell keyword

也许你可以用 -c 这个选项来明确调用bash,这样就能获取它的时间信息。

根据你使用的系统版本,默认的命令行工具可能是dash,这是一种更简单的命令行工具,没有时间这个关键词。Debian和Ubuntu都使用dash,但我不太清楚Red Hat、Fedora等其他系统用的是什么。

撰写回答