Как мне использовать функцию bash time из python? - PullRequest
2 голосов
/ 23 июня 2009

Я хотел бы использовать 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

вы получите ожидаемый результат, как указано в справочных страницах.

Я хочу, чтобы время истекло, потому что оно кажется более точным. Моя проблема в том, что когда вы пытаетесь использовать команду «time prog args» из python, она не ведет себя так, как при вводе.

Код ниже, чтобы увидеть, что я делаю (извините за разгильдяйство):

#!/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 ]

2 голосов
/ 23 июня 2009

Вы правы, что у bash есть своя собственная версия времени.

$ type time
time is a shell keyword

Возможно, вы могли бы явно вызвать bash с опцией -c, чтобы узнать время.

В зависимости от того, какой дистрибутив вы используете, оболочкой по умолчанию может быть dash, более простая оболочка, у которой нет времени в качестве ключевого слова. И Debian, и Ubuntu используют тире, но я не знаю, что используют Red Hat, Fedora и другие.

0 голосов
/ 23 июня 2009

Я не думаю, что время будет более точным, чем методы Pythons, если только вы не используете os.times () в версиях ниже 2.5.3 и не смотрите на время пользователя, потому что более ранние версии Python имеют большое значение.

И хотя команда time ведет себя не так, как встроенная в bash time, они оба возвращают соответствующую информацию, поэтому мне неясно, в чем проблема, на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...