目录
1. 前言
在 Python 编程的世界里,我们常常会遇到需要长时间运行的任务,比如处理大型数据集、训练机器学习模型或者执行批量文件操作等。在这些场景下,程序的运行进度往往是开发者和用户都非常关心的事情。试想一下,当一个任务需要数分钟甚至数小时才能完成时,如果没有一个清晰的进度指示,我们只能干巴巴地等待,不知道任务进行到了哪一步、还要多久才能结束,这种等待无疑是煎熬的。而 tqdm 库能够为我们的循环操作添加一个漂亮的进度条,让我们实时掌握任务的进展情况,给漫长的等待带来一丝慰藉和掌控感。
2. tqdm库的安装
tqdm 是一个快速、扩展性极强的 Python 进度条库,它支持 Jupyter notebook、命令行以及任何其他 Python 环境。它的名字来源于阿拉伯语中的 "taqaddum",意思是 "进步"。tqdm 的设计初衷是为了让开发者能够轻松地在循环中添加进度显示功能,无需复杂的代码配置,只需简单的几行代码,就能让单调的循环操作变得直观可见。
tqdm 的安装非常简单,我们可以通过 pip 或者conda快速安装:
pip install tqdm
conda install tqdm
安装完成后,就可以在我们的 Python 脚本中导入并使用它了。
3. tqdm 的基础用法
3.1 tqdm显示for循环进度
在 Python 中,最常见的循环结构就是 for 循环。tqdm 可以轻松地为 for 循环添加进度条。下面是一个简单的示例:
from tqdm import tqdm
import time
for i in tqdm(range(10000)):
time.sleep(0.001) # 模拟耗时操作
运行结果如下:
在这个示例中,我们导入了 tqdm 模块,并使用 tqdm 包装了 range(10000) 这个迭代对象。当循环开始执行时,tqdm 会自动在控制台显示一个进度条,实时更新循环的进度。进度条会显示当前的迭代次数、已完成的百分比、预计剩余时间等信息。随着循环的推进,进度条会逐渐填充,直到循环结束,进度条显示 100% 完成。
3.2 tqdm显示迭代器的进度
除了 for 循环,tqdm 还可以为任何可迭代对象(如列表、字典、文件对象等)添加进度显示。例如,我们有一个包含大量数据的列表,需要对其进行处理:
from tqdm import tqdm
import time
data = [i for i in range(1000)] # 模拟一个大型数据列表
for item in tqdm(data):
time.sleep(0.01) # 模拟数据处理操作
在这里,我们将 tqdm 包装在 data 列表外面,这样在遍历列表时,tqdm 就会显示进度条,让我们清楚地知道数据处理的进度。
更多类型迭代器请查看《关于python中迭代器(iterator)基本用法与具体应用的理解》
3.3 自定义进度条样式
tqdm 允许我们自定义进度条显示的信息,比如添加描述文本、修改进度条的样式等。这在我们处理多个不同的任务时非常有用,可以通过不同的描述来区分各个任务的进度。例如:
from tqdm import tqdm
import time
for i in tqdm(range(100), desc="Processing Data"):
time.sleep(0.1) # 模拟数据处理操作
在这个例子中,我们通过 desc 参数为进度条添加了一个描述文本 "Processing Data",这样在进度条的前面就会显示这个文本,让我们更清楚地知道当前进度条对应的任务是什么。
4. tqdm 的高级应用
4.1 多线程与多进程中的进度显示
在处理大规模数据或高并发任务时,我们经常会使用多线程或 multiprocessing 模块来提高程序的执行效率。tqdm 也能够很好地支持这些场景,为多线程或多进程任务提供进度显示。
关于线程的用法可以参考:
from tqdm import tqdm
import threading
import time
counter=0
def worker():
global counter
counter+=1
for i in tqdm(range(100), desc=f"Worker Thread{counter}"):
time.sleep(0.1)
# 创建并启动多个线程
threads = []
for _ in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()
运行部分结果如下:
在这个示例中,我们创建了 5 个线程,每个线程都执行一个带有 tqdm 进度条的循环任务。tqdm 会为每个线程单独显示一个进度条,让我们可以清楚地看到每个线程的执行进度。
4.2 文件操作的进度显示
在进行文件读写、下载等操作时,tqdm 也可以派上用场。例如,我们想读取一个大型文件,并显示读取进度:
from tqdm import tqdm
import time
file_path = "large_file.txt" # 假设这是一个大型文件
with open(file_path, "r") as f:
for line in tqdm(f, desc="Reading File"):
time.sleep(0.001) # 模拟文件读取操作
在这里,我们将文件对象 f 传递给 tqdm,tqdm 会根据文件的行数自动计算进度,并在读取文件的过程中显示进度条。
其中with操作可以参考:
《Python中的上下文管理器:使用with管理成对操作,初级及高级用法解析》
4.3 与 pandas 数据处理的结合
在数据分析领域,pandas 是一个非常常用的库。当我们对 pandas 的 DataFrame 进行操作时,常常会遇到耗时的任务。tqdm 可以与 pandas 无缝结合,为数据处理提供进度显示。
关于panda's库的用法可以参考:
这也是我最喜欢切最常用的一个功能。
import pandas as pd
from tqdm import tqdm
import time
# 创建一个大型 DataFrame
data = pd.DataFrame({"A": range(10000), "B": range(10000)})
# 使用 tqdm 包装 pandas 的 apply 方法
tqdm.pandas(desc="Processing DataFrame")
data.progress_apply(lambda row: time.sleep(0.0001), axis=1)
在这个例子中,我们使用 tqdm.pandas 方法为 pandas 的 apply 方法添加了进度显示功能。通过 progress_apply 方法,我们可以在对 DataFrame 的每一行进行操作时,实时看到进度条的更新。
5. 总结
tqdm 库以简洁的接口和强大的功能,为我们的循环操作带来了直观的进度显示。无论是简单的 for 循环、文件操作,还是复杂的多线程、多进程任务以及 pandas 数据处理,tqdm 都能轻松应对,让我们在漫长的程序运行过程中不再迷茫和焦虑。
在实际的开发工作中,合理地使用 tqdm 库,不仅可以提高我们的工作效率,还能让程序的运行过程更加透明和可控。而且,tqdm 的高度可定制性也为我们提供了极大的灵活性,可以根据不同的需求自定义进度条的样式和信息显示。我是橙色小博,关注我,一起在人工智能领域学习进步。