我使用tqdm来为使用hyperopt进行长时间运行的优化过程打印进度条。该过程调用一个函数大约500次,每次调用需要10到20分钟左右的时间,因此我开始将进度显示细化,并在循环中添加了一些
您可以看到,这是函数的第73次调用,而这第73次函数调用已经完成了大约70%。实际上,我只是估计了函数中子步骤
当然,准确性在这里不是问题。但我想显示73.70而不是73.69999999999993。 我已经尝试将我的更新值四舍五入到两个小数位,但这没有解决问题,因为浮点数存在精度问题,如果一个数字不能被浮点数精确表示,则变得非常长。 根据 tqdm 的文档,此部分隐藏在整个格式字符串的
根据文档,
这是我的代码:
在被调用的函数中(它是
tqdm.update
语句,分数式地推进进度条以避免出现两个嵌套的进度条,同时仍能立即看到已执行了多少个函数调用。现在这个丑陋的结果看起来像这样: 15%|███▌ | 73.69999999999993/500 [7:40:31<102:54:08, 868.98s/it, evaluating fold 2 of 2 folds...]Iteration 1, loss = 2.50358388
您可以看到,这是函数的第73次调用,而这第73次函数调用已经完成了大约70%。实际上,我只是估计了函数中子步骤
m
的数量(可能因调用而异),并使用分数1/m
来更新进度条。然后,在函数调用结束后,我只需将进度条重新同步为一个完整的整数,以避免添加舍入误差。当然,准确性在这里不是问题。但我想显示73.70而不是73.69999999999993。 我已经尝试将我的更新值四舍五入到两个小数位,但这没有解决问题,因为浮点数存在精度问题,如果一个数字不能被浮点数精确表示,则变得非常长。 根据 tqdm 的文档,此部分隐藏在整个格式字符串的
r_bar
部分中,但我找不到设置它的方法。你能帮我吗?根据文档,
r_bar
默认为:r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, '
这是我的代码:
with tqdm(iterable=None, initial=num_trials, maxinterval=maxinterval, total=max_evals, ascii=False, disable=show_progressbar is False) as progress_bar:
def fn_to_minimize(*args, **kwargs):
return fn(*args, **kwargs, _progress_bar=progress_bar)
for num_trials in range(num_trials, max_evals):
progress_bar.n=float(num_trials)
progress_bar.refresh()
best = fmin(**kwargs, fn=fn_to_minimize, trials=trials, max_evals=num_trials+1)
# do some other stuff here
在被调用的函数中(它是
kwargs
参数中的一个条目),我会像这样更新进度条:_progress_bar.update(round(update_value, 2))
r_bar
替换它的定义,并将{n_fmt}
更改为{n:.2f}
(n_fmt
已经是一个字符串),它会显示我想要的内容。 - jottbe