我如何使用python的bash time函数?

时间:2009-06-23 19:16:47

标签: python linux bash unix time

我想使用python对程序进行系统调用并为它们计时。如果键入:

,请从Linux命令行
$ time prog args

你得到的结论是:

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

如果您执行“人工时间”,则表示您可以输入:

$ time -f "%E" prog args

以格式化为仅显示已用时间。这在shell中不起作用。我相信它不起作用,因为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 :(得分:2)

bash有自己的时间版本,这是正确的。

$ type time
time is a shell keyword

也许您可以使用-c选项显式调用bash来获取它的时间。

根据您使用的分发版,默认shell可能是破折号,一个没有时间作为关键字的简单shell。 Debian和Ubuntu都使用dash,但我不知道Red Hat,Fedora和其他人使用的是什么。

答案 1 :(得分:0)

我认为时间不会比Pythons方法更准确,除非你在2.5.3以下的版本中使用os.times(),并查看用户时间,因为Python的早期版本有很大的优势。 / p>

虽然time命令的行为与bash的内置时间不同,但它们都会返回相关信息,因此我不清楚问题是什么,真的。