前言
在处理大量数据或执行耗时操作时,了解代码执行的进度是至关重要的。在Python中,通过使用进度条可以有效地实现对代码执行进度的可视化展示。
tqdm
是一个快速、可扩展的Python进度条库,能够实时显示代码执行的进度。并且它提供了简洁的API,因此开发者可以轻松地为循环、迭代器等任务添加进度条,让你一目了然地了解代码执行的进展情况。
基础使用
from tqdm import tqdm
import time# 某个你需要执行的方法
def time_cut(data):# 每次调用,休眠data*0.1秒time.sleep(data * 0.1)# 模拟一个耗时的任务,调用同一个方法10次
def some_long_task():for index in tqdm(range(10), desc="Processing"):# 模拟任务处理时间time_cut(index)# 调用耗时任务函数
some_long_task()
顺序执行
from tqdm import tqdm
import timedef method_A():# 模拟方法A的执行time.sleep(1)return "Method A result"def method_B():# 模拟方法B的执行time.sleep(1)return "Method B result"def method_C():# 模拟方法C的执行time.sleep(1)return "Method C result"# 顺序执行A、B、C三个方法,并显示进度条
def sequential_ABC():results = []# 使用tqdm显示进度条with tqdm(total=100) as pbar:# 执行方法Aresult_A = method_A()results.append(result_A)pbar.update(30) # 更新进度条# 执行方法Bresult_B = method_B()results.append(result_B)pbar.update(30) # 更新进度条# 执行方法Cresult_C = method_C()results.append(result_C)pbar.update(40) # 更新进度条return results# 调用顺序执行方法的函数
if __name__ == "__main__":results = sequential_ABC()print("结果:", results)
多线程调用
这里要注意一下,如果子线程一旦使用print()输出,将导致出现梯形进度条
import concurrent.futures
from tqdm import tqdm
import time# 并行处理的主函数
def parallel_processing(data_list, num_threads):with concurrent.futures.ThreadPoolExecutor(max_workers=num_threads) as executor:futures = []for data in data_list:if data % 2 == 0:future = executor.submit(process_data, data)else:future = executor.submit(process_data1, data)futures.append(future)# 使用tqdm包装executor.map以显示进度条results = []with tqdm(total=len(data_list), desc="process") as pbar:for future in concurrent.futures.as_completed(futures):result = future.result()results.append(result)pbar.update(1)return results# 你的并行处理函数
def process_data(data):time.sleep(data) # 模拟处理数据的耗时操作return data * 2 # 假设这里是对数据进行处理的函数# 你的并行处理函数
def process_data1(data):time.sleep(1) # 模拟处理数据的耗时操作return data * 2 # 假设这里是对数据进行处理的函数if __name__ == "__main__":# 要处理的数据列表data_list = list(range(10))# 设置线程数量num_threads = 4# 调用并行处理函数results = parallel_processing(data_list, num_threads)# 打印结果print("处理结果:", results)
我没研究解决方案,如果有人能解决这一问题,请评论区指教
多进程调用
【tqdm】貌似不支持管理【下属多进程任务】,因此你可能需要在【tqdm】之上建立进程来管理【tqdm和与之关联的任务】,而不是在tqdm下级建立进程
并且相同的是,tqdm与多线程一样,如果下属任务有print()操作也将导致梯形进度条
from tqdm import tqdm
import multiprocessing
import timedef method_way1(data):# 模拟方法A的执行time.sleep(data)return f"Method1 sleep {data}"def method_way2():# 模拟方法A的执行time.sleep(1)return f"Method2 sleep 1"def method_way3():# 模拟方法A的执行time.sleep(2)return f"Method3 sleep 2"# 使用tqdm显示进度条
def tqdm_multi(data, desc):# 使用tqdm显示进度条results = []with tqdm(total=100, desc=desc) as pbar:# 执行方法1result_1 = method_way1(data)results.append(result_1)pbar.update(40) # 更新进度条# 执行方法2result_2 = method_way2()results.append(result_2)pbar.update(30) # 更新进度条# 执行方法3result_3 = method_way3()results.append(result_3)pbar.update(30) # 更新进度条print(results)# 调用顺序执行方法的函数
if __name__ == "__main__":data = 4a = multiprocessing.Process(target=tqdm_multi, args=(data, 'proess A'))a.start()a.join()b = multiprocessing.Process(target=tqdm_multi, args=(data, 'proess B'))b.start()
其实,考虑不在子方法里输出print()也可以,请君自便吧