如何在调用库函数的代码中添加进度条以展示程序执行进度
Python 为NetworkX图计算代码添加进度条实现方案
Python生态最常用的轻量进度条工具为tqdm,可以无侵入地接入自定义逻辑、第三方库函数实现进度展示,以下是针对你提供的代码的修改方案:
前置准备
首先安装依赖库:
pip install tqdm
核心修改思路
- 图的总节点数可通过
graph.number_of_nodes()直接获取,以此作为进度条的总长度,进度百分比准确度更高 - 自定义DFS函数中,每成功访问1个未遍历的节点就更新一次进度
- NetworkX的内置返回迭代器的函数(比如
connected_components),直接将迭代器传入tqdm即可自动捕获迭代进度
修改后完整代码
import networkx as nx from tqdm import tqdm import sys # 可选:调整Python递归深度限制,避免10万节点递归DFS爆栈,节点数过大建议改为迭代版DFS sys.setrecursionlimit(1 << 25) # 生成随机图,注意生成的节点为整数类型,后续调用DFS不要传字符串类型的节点ID graph = nx.erdos_renyi_graph(100000, .2) visited = set() # 初始化DFS进度条,总长度为总节点数,设置进度条描述 pbar = tqdm(total=graph.number_of_nodes(), desc="DFS遍历进度") def dfs(visited, graph, node): if node not in visited: # 不需要打印节点的话可以注释掉下面这行,避免输出过多影响进度条展示 # print(node) visited.add(node) # 每访问一个节点更新一次进度 pbar.update(1) for neighbour in graph[node]: dfs(visited, graph, neighbour) print("以下是深度优先搜索执行过程:") # 注意这里节点ID是整数5000,不是字符串'5000',否则会找不到节点报错 dfs(visited, graph, 5000) # DFS执行完后关闭进度条 pbar.close() # 给连通分量计算加进度条,desc设置进度条描述 print("正在计算连通分量:") coms = list(tqdm(nx.connected_components(graph), desc="连通分量计算进度"))
补充说明
- 如果不需要打印每个遍历到的节点,建议注释掉DFS中的
print(node)逻辑,大量的打印输出会拖慢执行速度,也会打乱进度条的展示效果 - 节点量级超过10万时递归DFS有栈溢出风险,生产环境建议替换为迭代实现的DFS逻辑
- tqdm支持自定义进度条样式、速度估算、剩余时间预估等配置,可根据需求调整参数
内容的提问来源于stack exchange,提问作者AHQ
相关产品推荐
相关产品推荐

