mcpField
T
tqdm

tqdm

github.com/tondevrel开发2459 次安装38 周前更新
代码仓库

关于 tqdm

tqdm 是用于为 Python 长时间运行的循环和操作显示进度的库及技能指南,涵盖控制台、Jupyter、pandas 和并行任务用法。

主要功能

  1. 01迭代器进度条
  2. 02I/O 操作手动追踪
  3. 03支持 Jupyter 和 pandas
  4. 04嵌套及并行进度

适用场景

  1. 01监控数据处理或训练循环
  2. 02追踪文件读取和下载
  3. 03查看 pandas 操作进度
  4. 04观察并发任务进度

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tondevrel/scientific-agent-skills --skill tqdm

安装后在 Claude Code 中输入/tqdm确认已加载。

详细介绍

tqdm - 智能进度条

tqdm 是 Python 中监控长时间运行循环的标准工具。它的开销可以忽略不计(每次迭代约 60ns),并且适用于各种环境:控制台、Jupyter notebook,甚至 GUI。

适用场景

  • 监控长时间运行的循环(模拟、数据处理、ML 训练)。
  • 跟踪文件下载或 I/O 操作的进度。
  • 为命令行工具提供可视化反馈。
  • 将进度跟踪集成到 pandas 操作中(progress_apply)。
  • 监控 concurrent.futures 或 multiprocessing 中的并行任务。
  • 为分层任务(例如 epoch 和 batch)创建嵌套进度条。

参考文档

官方文档:https://tqdm.github.io/
GitHub:https://github.com/tqdm/tqdm
搜索模式:from tqdm import tqdm、tqdm.pandas()、tqdm.notebook、tqdm.contrib

核心原则

迭代式包装器

使用 tqdm 最简单的方式是包装任意可迭代对象:for item in tqdm(iterable):。它会自动计算长度并估算剩余时间。

低开销

tqdm 的设计目标是极快。它使用智能算法限制显示更新的次数,避免拖慢实际计算。

集成

tqdm 为不同环境提供了专用模块(Jupyter、Keras、Pandas、Slack/Telegram 通知)。

快速参考

安装
pip install tqdm
标准导入
from tqdm import tqdm
import time

# For Jupyter Notebooks specifically:
# from tqdm.notebook import tqdm
基本模式 - 自动跟踪循环
import time
from tqdm import tqdm

# Just wrap the range or list
for i in tqdm(range(1000)):
    time.sleep(0.01) # Simulate work

关键规则

✅ 应做事项
  • 使用 desc - 为进度条添加描述,以便准确了解正在运行的进程(tqdm(range(10), desc="Processing"))。
  • 在嵌套循环中使用 leave=False - 这样内层进度条完成后会被清除,避免控制台杂乱。
  • 使用 notebook 版本 - 在 Jupyter 中,使用 from tqdm.notebook import tqdm 来显示美观的 HTML 进度条。
  • 手动设置 total - 如果迭代器没有 __len__,请手动提供 total 参数。
  • 集成 Pandas - 使用 tqdm.pandas() 查看 .progress_apply() 的进度。
  • 关闭手动创建的进度条 - 如果使用手动的 pbar = tqdm(...) 方式,请始终使用 with 语句或调用 pbar.close()。
❌ 不应做事项
  • 更新过于频繁 - 避免在紧密循环中手动更新(例如每秒数百万次);包装迭代器后,tqdm 会自动处理。
  • 在 tqdm 内使用控制台打印 - 标准的 print() 会破坏进度条。请改用 tqdm.write("message")。
  • 忽略开销 - 虽然开销很低,但如果循环主体的耗时不到微秒,任何开销都很重要;此时应改为批量处理。
  • 忘记 ascii=True - 如果使用旧式终端或不支持 Unicode 的 Windows CMD,请使用 ascii=True 以避免字符显示异常。

反模式(绝对不要)

from tqdm import tqdm
import time

# ❌ BAD: Mixing print() and tqdm (Corrupts the bar)
for i in tqdm(range(5)):
    print(f"Doing step {i}") # Bar jumps to next line
    time.sleep(0.1)

# ✅ GOOD: Use tqdm.write()
for i in tqdm(range(5)):
    tqdm.write(f"Doing step {i}") # Bar stays at the bottom
    time.sleep(0.1)

# ❌ BAD: Manual update without closing (Potential memory leak/UI hang)
pbar = tqdm(total=100)
for i in range(100):
    pbar.update(1)
# Missing pbar.close()!

# ✅ GOOD: Use context manager
with tqdm(total=100) as pbar:
    for i in range(100):
        pbar.update(1)

# ❌ BAD: Wrapping an iterator with no length without 'total'
# tqdm(my_generator) # Shows count but no progress bar/ETA

高级用法和自定义

描述和统计信息
pbar = tqdm(range(100))
for i in pbar:
    # Update description dynamically
    pbar.set_description(f"Processing Step {i}")
    
    # Add custom stats (e.g., loss in ML)
    pbar.set_postfix(loss=0.5/(i+1), accuracy=i/100)
    time.sleep(0.05)
手动控制(适用于非迭代工作)
# Useful for tracking bytes in file I/O or API calls
with tqdm(total=1024, unit='B', unit_scale=True, desc="Downloading") as pbar:
    # Simulate chunked download
    for chunk_size in [256, 128, 512, 128]:
        time.sleep(0.5)
        pbar.update(chunk_size)

与生态系统集成

Pandas 集成
import pandas as pd
from tqdm import tqdm

# Initialize tqdm for pandas
tqdm.pandas(desc="Cleaning Data")

df = pd.DataFrame({'val': range(10000)})

# Use progress_apply instead of apply
result = df['val'].progress_apply(lambda x: x**2)
嵌套进度条
# Perfect for Epochs vs Batches in deep learning
for epoch in tqdm(range(3), desc="Epochs"):
    for batch in tqdm(range(10), desc="Batches", leave=False):
        time.sleep(0.05)
并行处理(concurrent.futures)
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm

def work(n):
    time.sleep(0.1)
    return n * 2

data = range(50)
with ThreadPoolExecutor() as executor:
    # Use tqdm to monitor map results
    results = list(tqdm(executor.map(work, data), total=len(data)))

实用工作流

1. 带进度显示的大文件读取器
import os

def read_large_file(filepath):
    """Read a file while showing a progress bar based on bytes."""
    file_size = os.path.getsize(filepath)
    with tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024) as pbar:
        with open(filepath, 'rb') as f:
            for chunk in iter(lambda: f.read(4096), b''):
                # Process chunk
                pbar.update(len(chunk))
2. 科学模拟套件
def run_simulation_suite(configs):
    """Run multiple simulations and log failures."""
    results = []
    with tqdm(configs, desc="Suite") as pbar:
        for config in pbar:
            try:
                res = run_single_sim(config)
                results.append(res)
            except Exception as e:
                tqdm.write(f"Error in config {config}: {e}")
            pbar.set_postfix(success=len(results))
    return results
3. 带自定义后缀的训练循环
def train_model(epochs, data_loader):
    pbar = tqdm(range(epochs), desc="Training")
    for epoch in pbar:
        loss = compute_loss() # dummy
        acc = compute_acc()   # dummy
        
        # Update the bar with current metrics
        pbar.set_postfix(loss=f"{loss:.4f}", acc=f"{acc:.2%}")

性能优化

mininterval 参数

默认情况下,tqdm 每 0.1 秒更新一次。如果终端速度较慢(例如通过 SSH 连接或使用旧式 GUI),可将 mininterval 调高至 1.0 或 5.0,以减少网络/I/O 流量。

for i in tqdm(range(1000000), mininterval=1.0):
    pass
在生产环境中禁用 tqdm

设置 disable=True 即可全局禁用进度条(例如,在 CI/CD 环境或非交互式日志中运行时)。

import os
# Check for environment variable
is_ci = os.environ.get('CI') == 'true'
for i in tqdm(range(100), disable=is_ci):
    pass

常见问题及解决方案

“双进度条”故障

在 Jupyter 中,进度条有时无法正确关闭,导致红色/绿色进度条层层堆叠。

# ✅ Solution: Always use a 'with' statement or try-finally
# Or clear all instances if stuck:
from tqdm import tqdm
tqdm._instances.clear()
Windows 上的 Unicode 错误

Windows CMD(非 Terminal)经常无法正常显示平滑的进度块。

# ✅ Solution: Use ASCII characters only
for i in tqdm(range(100), ascii=True):
    pass
多个进度条对齐

如果进度条重叠或跳动:

# ✅ Solution: Specify the position explicitly
# Useful for manual multi-threading
pbar1 = tqdm(total=100, position=0)
pbar2 = tqdm(total=100, position=1)

tqdm 是对脚本的一项小改进,却能带来巨大的心理安慰。它为代码提供“脉搏”,确保你始终了解耗时较长的科学任务进展如何。

评论

支持 Markdown