如何用Rich实现球谐系数嵌套循环的进度条
使用Rich库实现动态嵌套进度条(适配球谐系数计算场景)
针对球谐系数计算中,外层循环l对应的内层m数量随l变化(总数为2l+1)的场景,以下是适配Rich库的嵌套进度条实现方案:
完整实现代码
import numpy as np from rich.progress import Progress from time import sleep l = 32 with Progress() as progress: # 初始化外层进度任务:跟踪所有l值的处理进度 outer_task = progress.add_task("[blue]处理l序列", total=l) for ll in np.arange(l): # 计算当前l对应的m值总数 m_count = 2 * ll + 1 # 动态创建内层进度任务:绑定当前l值,展示该l下m的处理进度 inner_task = progress.add_task(f"[green]l={ll} 处理m序列", total=m_count) for mm in np.arange(-ll, ll + 1): # 模拟球谐系数计算过程 sleep(0.01) # 推进内层进度条 progress.update(inner_task, advance=1) # 输出计算日志,Rich会自动避免覆盖进度条 progress.print(f"完成计算: l=[{ll}], m=[{mm}]") # 标记当前l对应的内层任务完成 progress.update(inner_task, completed=m_count) # 推进外层进度条 progress.update(outer_task, advance=1)
方案说明
- 动态适配内层循环长度:每次进入外层
l循环时,根据当前ll计算m的总数,动态创建对应的内层进度任务,解决了固定子循环总数的限制。 - 进度与日志共存:使用
progress.print()替代原生print,Rich会自动将日志输出在进度条下方,不会出现进度条被覆盖的问题。 - 清晰的层级展示:外层进度条跟踪整体
l序列的处理进度,内层进度条绑定当前l值,直观展示每个l下m的处理状态。 - 避免tqdm的遗留问题:无需依赖
leave=False参数,每个内层任务完成后会保留进度记录(或可通过progress.remove_task(inner_task)手动移除),不会丢失最后一条输出。
内容的提问来源于stack exchange,提问作者Aman Chokshi
相关产品推荐
相关产品推荐

