如何将tqdm进度条格式化为每分钟显示进度,而不是每秒钟?

8

我在GitHub文档中找不到相关信息,但我想知道是否有一种集成化的方法(最好)或解决方法来显示每个迭代所需平均时间(以分钟为单位),而非以秒为单位。

具体而言,tqdm显示类似于1283.31s/it的内容,但如果每次迭代需要几分钟或几小时,则更有帮助的是显示类似于21m/it的东西。

1个回答

1
我们可以通过按照手册中部分描述的方法,在自定义的tqdm实例中添加自定义的bar_format参数来实现这一点。
class TqdmExtraFormat(tqdm):
    """Provides a `minutes per iteration` format parameter"""
    @property
    def format_dict(self):
        d = super(TqdmExtraFormat, self).format_dict
        rate_min = '{:.2f}'.format(1/d["rate"] / 60) if d["rate"] else '?'
        d.update(rate_min=(rate_min + ' min/' + d['unit']))
        return d

我们正在这里覆盖format_dict,使用一个自定义版本添加一个可在bar_format参数中使用的新状态。 d是现有的format_dict,因此我们可以使用它来获取{rate}的值,将其转换为每次迭代的时间(1 / rate),除以60,然后将其格式化为2位小数。然后,我们使用新状态更新d - 我们甚至可以使用字符串连接添加一些格式。请注意,在完成任何迭代之前,{rate}None,这意味着除非您进行if d["rate"]检查,否则会出现错误。

完成后,如果您使用自定义的tqdm实例,则可以在bar_format参数字符串中使用此状态以及Parameters中列出的状态。

b='{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_min}{postfix}]'
for i in TqdmExtraFormat(range(2), unit_scale = 60, bar_format=b):
    time.sleep(6)

enter image description here


1
类 TqdmExtraFormat(tqdm): 类型错误:module() 最多接受 2 个参数(已给出 3 个) - joe hoeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接