在 Python 中,你可以使用 tqdm
库来监控 for
循环的进度,它能显示一个直观的进度条,帮助你了解循环的执行情况。以下是具体的使用方法:
安装 tqdm
如果你还没有安装 tqdm
,可以使用以下命令进行安装:
pip install tqdm
基本用法
使用 tqdm
包装可迭代对象(如列表、范围等),它会自动显示进度条:
from tqdm import tqdm
import time
# 模拟一个耗时的循环
for i in tqdm(range(100)):
time.sleep(0.1) # 模拟耗时操作
运行这段代码,你会看到类似下面的进度条:
100%|████████████████████████████████████████| 100/100 [00:10<00:00, 9.97it/s]
处理 Pandas DataFrame
如果你需要处理 Pandas DataFrame 的行,可以使用 tqdm.pandas()
方法:
import pandas as pd
from tqdm import tqdm
# 初始化 tqdm 用于 pandas
tqdm.pandas()
# 创建一个示例 DataFrame
df = pd.DataFrame({'a': range(100), 'b': range(100, 200)})
# 使用 progress_apply 代替 apply
df['result'] = df.progress_apply(lambda row: row['a'] + row['b'], axis=1)
自定义进度条
你可以通过参数自定义进度条的外观和行为:
from tqdm import tqdm
import time
# 自定义进度条
for i in tqdm(range(100), desc="处理中", unit="项", colour="green"):
time.sleep(0.1)
这将显示一个绿色的进度条,并带有自定义描述和单位:
处理中: 100%|███████████████████████████████| 100/100 [00:10<00:00, 9.97项/s]
在 Jupyter Notebook 中使用
在 Jupyter Notebook 中,推荐使用 tqdm.notebook.tqdm
以获得更好的显示效果:
from tqdm.notebook import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.1)
嵌套循环
对于嵌套循环,tqdm
也能正常工作:
from tqdm import tqdm
import time
for i in tqdm(range(5), desc="外层循环"):
for j in tqdm(range(100), desc="内层循环", leave=False):
time.sleep(0.01)
使用 leave=False
参数可以避免内层循环的进度条干扰外层循环的显示。
通过以上方法,你可以方便地使用 tqdm
监控任何 for
循环的进度,让你的程序执行过程更加透明。
监控多线程进度
with ThreadPoolExecutor(max_workers=10) as executor:
futures = [
executor.submit(_doc_mark, file_content)
for file_content in split_data
]
for future in tqdm(
concurrent.futures.as_completed(futures),
total=len(futures),
desc=".....",
unit="chunk",
):
result = future.result()
if isinstance(result, tuple) and result[0]:
# logging.info(f'....{result}')
results.extend(result[1])
else:
logging.error(f"....{result}")
failed.append(result[1])
监控异步进度
from tqdm.asyncio import tqdm
async def test_cases_scenario_evaluate(
self, requirement_doc: str, test_cases: List[dict]
) -> any:
async def bounded_task(
sem: asyncio.Semaphore,
requirement_doc_part: str,
inner_test_cases: List[dict],
):
async with sem:
return await self.genai_service.test_cases_scenario_evaluate(
requirement_doc_part, inner_test_cases
)
split_data = requirement_doc.split(SplitMark.DOC_SPLIT_MARK)
final_results = []
failed_results = []
sem = asyncio.Semaphore(10)
tasks = [
bounded_task(sem, part, test_cases['success'])
for part in split_data
]
progress_bar = tqdm(
total=len(tasks),
desc="Evaluating test-case scenarios",
unit="part",
dynamic_ncols=True
)
for coro in asyncio.as_completed(tasks):
data = await coro
result = data['result']['final_results']
failed_result = data['result']['failed_cotent']
final_results.append(result)
failed_results.append(failed_result)
progress_bar.update(1) # 手动更新进度条
progress_bar.close() # 关闭进度条
return {
"success": final_results, # 修正为返回所有结果
"failed": failed_results, # 修正为返回所有失败结果
}