我有一个Python脚本,如下所示:
def function2(x):
for j in range(100):
# long-running computation on x and j
def function1():
for i in range(100):
function2(i)
我希望将持续状态打印到终端,如下所示:
Current i: 10
Current j: 31
它会随着 i 和 j 的变化而不断更新。我尝试使用回车符进行打印,但是一旦第二个函数开始打印,它就会删除第一个函数的输出。
一种解决方案是将
i
传递给第二个函数。这可行,但实际函数很复杂,并且已经接受了 11 个不同的输入,因此为了可读性,我不想再添加一个。我希望有一个内置方法可以做到这一点。
实际情况有点复杂,因为循环不仅仅是在某个范围内循环,而是二分搜索。因此,仅从局部变量(例如,
x
)无法判断二分搜索的进度。这也使得现有的进度条包更具挑战性。
tqdm
成功了。
在我的特定情况下,我正在进行二分搜索。因此,我可以采用初始间隔的大小、搜索退出时的精度截止以及它们以 2 为底的对数的差值来获取迭代次数。这使得 tqdm 相当简单:
from tqdm import tqdm
low_theta = mp.pi / 6
high_theta = mp.pi / 2
theta=low_theta
pbar_length = log2(high_theta - low_theta)
pbar = tqdm(total=int(pbar_length - log2(1e-5)), leave=False, desc = str("Theta ")+str(recursion_depth) + str(" 1st loop"))
while abs(high_theta - low_theta) > 1e-5:
theta = (high_theta + low_theta)/2
if costly_subroutine(theta):
high_theta = theta
else:
low_theta = theta
pbar.update(1)
pbar.close()
这会在顶部显示一个非常缓慢移动的进度条,下面显示第二个进度条。每次第二个进度条结束时,最上面的进度条就会向前跳。