умножить объект времени Python? - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу оценить оставшееся время, необходимое для выполнения скрипта, написанного на python, с (вложенным) циклом, а внутри цикла есть тест, выполнение которого может занять несколько секунд.Тест будет выполнен несколько тысяч раз, поэтому до его завершения потребуется несколько часов.Измеряя, сколько времени занимает один тест, я хочу оценить, сколько часов потребуется, прежде чем скрипт завершится.

from time import time, strftime

for i in range(n):
    t = time()      # current time
    ...very complicated test that can take quite a few seconds that uses i 
    elapsed = time() - t    #calculate time required to execute test

Когда я пытаюсь умножить время, необходимое для выполнения теста один раз

remaining_time = elapsed * (n - i)
remaining_time_s = strftime("%H:%M:%S", remaining_time)
print("estimated remaining time:", remaining_time)

вызов strftime дает:

TypeError: Tuple or struct_time argument require

Почему кратное время () не является объектом времени?

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Ваше elapsed значение - это число с плавающей запятой.Вы можете преобразовать его в datetime.timedelta объект и распечатать его.Это не позволит вам указать формат строки.

from datetime import timedelta

remainingTime = timedelta(seconds=(elapsed*(n-i)))
print("estimated remaining time: {}".format(str(remainingTime))
0 голосов
/ 21 февраля 2019

Если вы ссылаетесь на time.time(), а не datetime.time() (потому что вы не можете умножить в последнем случае), time.time() не является объектом времени.Это float.datetime.strftime ищет datetime объект.

Если вы посмотрите на remainingTime, вы заметите, что на самом деле он должен быть float, который намного меньше, чем вы ожидаете.Это потому, что, выполнив time() - t, вы фактически удалили большую часть информации о метках времени, что позволяет преобразовать обратно в datetime.

Короче, не используйте strftime для преобразования float.Вы могли бы сделать это вместо:

for i in range(n):
    t = datetime.datetime.now()

    ... some codes ...

    elapsed = datetime.datetime.now() - t   # gives you a timedelta object

    elapsed *= n-1                          # still a timedelta object

    print(elapsed)

    # 0:00:42.276000
0 голосов
/ 21 февраля 2019

Ваши elapsed и ваши remaining_time значения являются просто числами с плавающей точкой, а не struct_time с.Вы можете преобразовать их с помощью gmtime или localtime:

>>> from time import time, localtime, strftime
>>> t = time()
>>> elapsed = time() - t
>>> strftime("%H:%M:%S", localtime(t))
'08:22:03'
>>> strftime("%H:%M:%S", localtime(elapsed + t))
'08:22:25'

Вы можете переключиться на datetime объекты, которые можно вычесть (timedelta объектов), и все это можно легко манипулировать:

>>> n = datetime.now()
>>> m = datetime.now()
>>> m - n
datetime.timedelta(0, 4, 316830)
>>> delta = m - n
>>> delta * 5
datetime.timedelta(0, 21, 584150)
>>> m + delta
datetime.datetime(2019, 2, 21, 8, 28, 24, 943365)
0 голосов
/ 21 февраля 2019

Если вы получаете это из модуля time, то t будет float:

>>> import time
>>> t = time.time()
>>> type(t)
<type 'float'>
>>> time.time()
1550765873.363

Это означает, что elapsed также предположительно является float, так какremainingTime.Но strftime необходимо указать объект datetime.date.

>>> t = datetime.datetime.now()
>>> type(t)
<type 'datetime.datetime'>
>>> print(datetime.datetime.strftime(t, "%H:%M:%S"))
11:16:57

Также обратите внимание на порядок аргументов.

Если у вас есть прошедшее время в секундах, которое вы хотите преобразовать в H: M: S, вы можете сделать что-то вроде этого:

H = remaining // 3600
M = (remaining - (3600*H)) // 60
S = remaining - (3600*H) - (60*M)
print("%d:%d:%d" % (H, M, S))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...