我想估计执行用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
为什么time()的倍数不是时间对象?
答案 0 :(得分:1)
如果您是从time
模块中获得的,那么t
将是浮点数:
>>> import time
>>> t = time.time()
>>> type(t)
<type 'float'>
>>> time.time()
1550765873.363
这意味着elapsed
也可能是浮点数,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))
答案 1 :(得分:1)
假设您引用的是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
答案 2 :(得分:0)
您的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)
答案 3 :(得分:0)
您的elapsed
值是一个浮点数。您可以将其转换为datetime.timedelta
对象并打印出来。这样做不能允许您指定字符串格式。
from datetime import timedelta
remainingTime = timedelta(seconds=(elapsed*(n-i)))
print("estimated remaining time: {}".format(str(remainingTime))