一、tqdm模块的应用
tqdm是一个快速,可扩展的Python进度条,可以用于任何可迭代的对象,如列表,元组,字典等。使用tqdm模块可以方便地显示进度条,并且可以加快代码运行速度。
以计算10000个数字的和为例:
from tqdm import tqdm
sum = 0
for i in tqdm(range(10000)):
sum += i
print(sum)
在代码中,通过循环遍历range(10000)的数字,每次加到变量sum中,并在tqdm()函数中使用range()函数来生成对应的进度条。执行代码后,控制台会一行一行地显示进度,并在最后输出结果。
此外,tqdm模块还支持多线程,可以同步地更新多个进度条。例如,计算10000个数字的和,同时对前100个数字进行乘法运算:
from tqdm import tqdm
import threading
class CalcThread(threading.Thread):
def __init__(self, start, end):
threading.Thread.__init__(self)
self.start = start
self.end = end
def run(self):
global sum
for i in range(self.start, self.end):
sum += i
return sum
class MutiThreadCalc():
def __init__(self, thread_num):
self.thread_num = thread_num
self.total_range = 10000
def calc(self):
global sum
sum = 0
threads = []
step = self.total_range // self.thread_num
for i in range(self.thread_num):
thread = CalcThread(i * step, (i + 1) * step)
threads.append(thread)
for t in threads:
t.start()
pbar_process = tqdm(total=self.total_range)
while True:
counts = 0
for t in threads:
if not t.is_alive():
counts += 1
pbar_process.update(counts * step)
if counts == len(threads):
break
pbar_process.close()
return sum
if __name__ == '__main__':
mtc = MutiThreadCalc(2)
sum = mtc.calc()
print('sum={}'.format(sum))
在代码中,通过继承Thread类创建一个线程类,然后按照分割的范围对计算任务进行拆分,每个线程计算一部分,最后汇总计算结果,更新进度条。执行结果如下:
sum=49995000
二、multiprocessing模块的应用
multiprocessing是Python中的进程模块,提供了创建和管理进程的方式,可以方便地进行并行处理。使用multiprocessing模块可以加快代码运行速度,提高程序的效率。
以简单的计算10000个数字的和为例:
from multiprocessing import Pool
from tqdm import tqdm
def calc(num):
sum = 0
for i in num:
sum += i
return sum
if __name__ == '__main__':
range_num = 10000
pool_num = 4
pool = Pool(processes=pool_num)
step = range_num // pool_num
ranges = [(i * step, (i + 1) * step) for i in range(pool_num)]
ranges[-1] = (ranges[-1][0], range_num)
results = []
for r in ranges:
result = pool.apply_async(calc, args=(range(r[0], r[1]),))
results.append(result)
pool.close()
pbar_process = tqdm(total=range_num)
while True:
counts = 0
for r in results:
if r.ready():
counts += 1
pbar_process.update(counts * step)
if counts == len(results):
break
pbar_process.close()
sum = 0
for r in results:
sum += r.get()
print('sum={}'.format(sum))
在代码中,通过创建进程池,按照分割的范围对计算任务进行拆分,每个进程计算一部分,最后汇总计算结果,更新进度条。执行结果如下:
sum=49995000
三、总结
使用tqdm模块和multiprocessing模块可以大大提高程序的效率,加快代码的运行速度。使用tqdm模块可以方便地显示进度条,使用multiprocessing模块可以实现并行处理,提高计算速度。