python一个优秀的时间函数,可以得到平均时间和剩余时间

上代码

import time
import datetime

class Timer(object):
	def __init__(self):
		self.init_time = time.time()
		self.total_time = 0.
		self.calls = 0
		self.start_time = 0.
		self.diff = 0.
		self.average_time = 0.
		self.remain_time = 0.

	def tic(self):#实现时间初始化
		self.start_time = time.time()

	def toc(self, average = True):#计算平均时间
		self.diff = time.time() - self.start_time
		self.total_time += self.diff
		self.call +=1
		self.average_time = self.total_time / self.calls
		if average:
			return self.average_time
		else:
			return self.diff

	def remain(self,iters,max_iters): # 剩余多长时间
		if iters == 0:
			self.remain_time = 0
		else:
			self.remain_time = (time.time() - self.init_time) / iters \ * (max_iters - iters)
		return str(datetime.timedelta(seconds = int(self.remain_time))) #转化为时分秒的格式

t = Timer()
t.tic()
time.sleep(3)
print(t.toc()) #3.00016450881958
a = t.remain(1,3)
print("remain time:%s"%a) #remain time:0:00:06

具体例子见代码注释。
下一篇见详细介绍yolo算法读取数据集及标签的代码

<think>好的,我现在需要在Python中实现动态显示剩余时间的功能。用户希望进度条能实时更新剩余时间,这听起来像是常见的进度条功能,但需要计算剩余时间。让我先回顾一下已有的知识引用的资料。 首先,用户提供的引用中有几个相关的代码示例。引用[2]、[3][5]都涉及进度条的实现,其中引用[5]提到了剩余时间计算。特别是引用[5]中的flush_percent函数,它根据已用时间完成百分比来估算总时间剩余时间。这个方法可能可以借鉴。 动态更新剩余时间的关键在于实时计算已用时间,并根据当前进度估算剩余时间。基本步骤应该是: 1. **记录开始时间**:在任务开始时获取当前时间。 2. **在每次迭代中计算已用时间**:当前时间减去开始时间。 3. **估算剩余时间**:已用时间除以当前进度百分比,得到总时间估算,再减去已用时间得到剩余时间。 4. **格式化显示**:将剩余时间转换为小时、分钟、秒的格式。 5. **动态更新控制台输出**:使用回车符`\r`覆盖前一行,保持进度条在同一行更新。 接下来,我需要考虑如何将这些步骤转化为Python代码。引用[5]中的代码已经做了类似的事情,比如使用`time.time()`获取开始时间计算已用时间,然后根据进度百分比估算剩余时间。然后,用`sys.stdout.write``\r`来实现动态更新。 但需要注意几个问题: - **进度百分比的计算**:必须确保当前进度是准确的,比如循环中的i从0到总数,需要正确计算当前完成的比例。 - **时间格式转换**:将秒数转换为HH:MM:SS格式,可以使用`divmod`函数来分解小时、分钟秒。 - **避免闪烁或输出混乱**:确保每次更新都使用`\r`回到行首,并且用`flush=True`或`sys.stdout.flush()`立即刷新输出缓冲区。 - **处理极端情况**:例如进度为0%时,剩余时间可能是无限大,需要处理除以零的情况,但通常在循环中i从1开始,所以可能不会有这个问题。 现在,结合这些思路,我可以写出一个示例代码。比如,假设有一个耗时任务,每次循环迭代时更新剩余时间。开始时间在循环开始前记录,每次迭代计算已用时间,然后根据当前进度估算剩余时间。然后用`print`或`sys.stdout.write`来动态显示。 另外,引用[4]提到了显示使用时间剩余时间的功能,其中使用了`process*100`作为百分比,已用时间剩余时间的格式化字符串。这可能与引用[5]中的方法结合使用。 可能的实现步骤: 1. 导入必要的模块,如`time``sys`。 2. 定义函数来格式化时间,将秒数转换为HH:MM:SS。 3. 在循环中,每次迭代计算已用时间剩余时间。 4. 更新控制台输出。 例如,代码结构可能如下: ```python import time import sys def format_time(seconds): # 将秒转换为HH:MM:SS m, s = divmod(seconds, 60) h, m = divmod(m, 60) return f"{int(h):02d}:{int(m):02d}:{int(s):02d}" total_items = 100 start_time = time.time() for i in range(total_items): # 执行任务 time.sleep(0.1) # 模拟耗时操作 current = i + 1 used_time = time.time() - start_time progress = current / total_items if progress > 0: remaining_time = (used_time / progress) * (1 - progress) else: remaining_time = 0 # 避免除以零 used_str = format_time(used_time) remaining_str = format_time(remaining_time) # 更新进度条剩余时间 bar_length = 30 filled = int(bar_length * progress) bar = '█' * filled + '-' * (bar_length - filled) sys.stdout.write(f"\r进度: |{bar}| {progress*100:.1f}% 已用: {used_str} 剩余: {remaining_str}") sys.stdout.flush() sys.stdout.write("\n任务完成!\n") ``` 这段代码在每次循环时计算已用时间剩余时间,并更新进度条。使用`sys.stdout.write``\r`来实现动态更新,避免换行。同时,处理了进度为0的情况,但在这个例子中因为i从0开始,current是i+1,所以第一次循环时progress是1/100=0.01,不会出现除以零的问题。 可能还需要考虑性能问题,比如每次循环都调用`time.time()`可能会有些开销,但对于大多数应用来说应该可以接受。此外,剩余时间的估算基于当前的平均速度,假设任务速度均匀,这在实际情况中可能不准确,但作为预估是常用的方法。 总结来说,实现动态剩余时间显示的关键点包括:正确的时间计算、进度百分比的处理、时间格式化动态更新控制台输出。参考引用中的方法,尤其是引用[5],可以有效地实现这一功能。</think>在Python中实现动态显示剩余时间的功能,可以通过计算已用时间进度百分比来估算剩余时间,结合控制台光标定位实现动态更新。以下是分步实现方法: --- ### **实现步骤** 1. **导入必要模块** ```python import time import sys ``` 2. **定义时间格式化函数** ```python def format_time(seconds): """将秒数转换为HH:MM:SS格式""" m, s = divmod(seconds, 60) h, m = divmod(m, 60) return f"{int(h):02d}:{int(m):02d}:{int(s):02d}" ``` 3. **核心逻辑:动态更新剩余时间** ```python def dynamic_remaining_time(total_tasks): start_time = time.time() # 记录开始时间 for i in range(total_tasks): # 模拟任务执行(例如处理一个文件) time.sleep(0.1) current = i + 1 used_time = time.time() - start_time # 已用时间 progress = current / total_tasks # 当前进度 # 估算剩余时间(基于当前平均速度) if progress > 0: remaining_time = (used_time / progress) * (1 - progress) else: remaining_time = 0 # 生成进度条显示文本 bar_length = 30 filled = int(bar_length * progress) bar = '█' * filled + '-' * (bar_length - filled) text = f"\r进度: |{bar}| {progress*100:.1f}% | 已用: {format_time(used_time)} | 剩余: {format_time(remaining_time)}" # 动态更新控制台输出 sys.stdout.write(text) sys.stdout.flush() print("\n任务完成!") # 调用示例 dynamic_remaining_time(100) ``` --- ### **关键原理** 1. **剩余时间估算** 剩余时间 = (已用时间 / 当前进度百分比) × (1 - 当前进度百分比),即假设任务匀速进行[^5]。 2. **动态更新控制台** 使用 `\r` 回车符将光标移动到行首,覆盖前一次输出内容,实现动态刷新效果[^2][^3]。 3. **时间格式转换** 通过 `divmod` 函数将秒数转换为小时、分钟、秒的易读格式[^5]。 --- ### **优化建议** 1. **平滑剩余时间计算** 使用移动平均算法(例如记录最近N次迭代的时间)来减少瞬时波动的影响。 2. **异常处理** 添加对 `total_tasks=0` 或 `progress=0` 的边界条件检查,避免除以零错误。 --- ### **示例输出** ``` 进度: |██████████████████████████-----| 86.0% | 已用: 00:00:08 | 剩余: 00:00:01 ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值