Преобразование вывода команды времени в секунды

У меня есть сценарий, который выводит время, затраченное на команду, следующим образом:

real    112m5.559s
user    0m0.002s
sys     0m0.000s

Я разбираю вывод скрипта с помощью python. Я хочу представить реальное время в секундах. У меня есть проанализированный вывод в переменной real_time.

Вот как я сейчас конвертирую его в формат секунд.

def gettime(x):
    m,s = map(float,x[:-1].split('m'))
    return 60 * m + s

real_time = "112m5.559s"
gettime(real_time)

Есть ли другой способ сделать это? (Вероятно, один лайнер, который более эффективен)


timeit проверяет ответы, приведенные ниже:

import pandas as pd

def gettime(x):
    m,s = map(float,x[:-1].split('m'))
    return 60 * m + s

real_time = "112m5.559s"

%timeit gettime(real_time)
%timeit int(real_time.split("m")[0]) * 60 + float(real_time.split("m")[1][:-1])
%timeit pd.to_timedelta(real_time).total_seconds()
%timeit sum(float(x) * 60 ** i for i, x in enumerate(reversed(real_time[:-1].split('m'))))

Выход

1.27 µs ± 55.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.39 µs ± 104 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
15.8 µs ± 714 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.63 µs ± 446 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Текущий метод кажется эффективным. @ bigbounty близок к тому, чтобы быть одновременно эффективным и однострочным.


person Saurabh P Bhandari    schedule 21.07.2020    source источник
comment
Можем ли мы попросить этот сценарий выдать его за секунды напрямую?   -  person Aditya    schedule 21.07.2020
comment
@Aditya Поскольку я использую команду time, я считаю, что это можно сделать с переменной TIMEFORMAT env, но за счет потери информации о пользователе и времени системы   -  person Saurabh P Bhandari    schedule 21.07.2020


Ответы (3)


вы можете использовать pandas.to_timedelta() для прямого анализа строки, например.

pd.to_timedelta('112m5.559s').total_seconds()
Out[26]: 6725.559

Однако ваш метод разделения строк кажется более чем в 10 раз быстрее:

%timeit gettime('112m5.559s')
1.04 µs ± 18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit pd.to_timedelta('112m5.559s').total_seconds()
11.8 µs ± 214 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

... так что я буду придерживаться этого.

person MrFuppes    schedule 21.07.2020

Обратитесь к этому ответу с аналогичным вопросом: - https://stackoverflow.com/a/6402934/10535841

Что касается решения, используя технику, использованную выше,

real_time = '112m5.559s'
secs = sum(float(x) * 60 ** i for i, x in enumerate(reversed(real_time[:-1].split('m'))))
print(secs)
person Suryansu Dash    schedule 21.07.2020
comment
согласно быстрому %timeit, это лишь примерно наполовину менее эффективно, чем решение OP - person MrFuppes; 21.07.2020
comment
Правда, это не быстрее, чем на самом деле - person Suryansu Dash; 21.07.2020

person    schedule
comment
Однострочный и почти эффективный, как текущий метод, который я использую - person Saurabh P Bhandari; 21.07.2020
comment
Если вы продолжите использовать pandas to_delta, вам придется импортировать библиотеку pandas только для этой цели. Подумайте о компромиссах - person bigbounty; 21.07.2020