【学习笔记】python模块--tqdm

8 min

今天总结一下 tqdm 模块以及 pytorch 框架选择 GPU 运行程序遇到的一个小问题。 tqdm 模块,是一个 python 进度条模块,简单已用。 tqdm 文档 github 推荐看 github 中的 README 了解如何使用,这个文档好像有点老旧。

pytorch 框架选择 GPU 运行程序

pytorch 框架选择 GPU 运行程序,发现os.environ["CUDA_VISIBLE_DEVICES"]="0"放置位置是有讲究的,需要放在倒入 torch 模块之前,才行。

经过测试,发现没有这个问题,之前我们遇到的问题是,程序没有用我自己设定的 gpu 跑代码,我调整了config文件(注:config文件中有语句os.environ["CUDA_VISIBLE_DEVICES"]="0")的导入顺序之后,发现解决了问题,因此我错误的认为os.environ["CUDA_VISIBLE_DEVICES"]="0"需要在 torch 模块之前导入才行。

tqdm 模块

tqdm.tqdm 类

tqdm.__init__(iterable=None,
              desc=None,
              total=None,
              leave=True,
              file=None,
              ncols=None,
              mininterval=0.1,
              maxinterval=10.0,
              miniters=None,
              ascii=None,
              disable=False,
              unit='it',
              unit_scale=False,
              dynamic_ncols=False,
              smoothing=0.3,
              bar_format=None,
              initial=0,
              position=None,
              postfix=None,
              unit_divisor=1000,
              write_bytes=None,
              lock_args=None,
              nrows=None,
              gui=False)

所有的参数都是可选的,初始化方法返回一个已经装饰了的可迭代器。

iterable参数

需要用进度条装饰的可迭代的对象,list 等等都可以。

desc参数

desc是进度条的前缀,字符串。如下图红框所示。

进度条的前缀
进度条的前缀

total参数

迭代的总次数,不设置的话,就等于可迭代对象的长度len(iterable),具体用法如下,常用于手动设置更新迭代次数。

with tqdm(total=100) as pbar:
    for i in range(10):
        sleep(0.1)
        pbar.update(10)
pbar = tqdm(total=100)
for i in range(10):
    sleep(0.1)
    pbar.update(10)
pbar.close()

leave参数

布尔类型,默认为Trueleave参数表示在迭代结束之后,是否保留进度条状态,如果设置为False或者None,则在迭代之后,不会保留最后的状态,而变成 0,如下图所示。

leave参数
leave参数

file参数

io.TextIOWrapper或者io.StringIO,默认为sys.stderr,表示将进度条信息输出到那里。如下图所示。

file参数
file参数

ncols参数

输出信息所占的宽度,不指定,则为进度条的整个宽度,指定则为指定的宽度,如下图。

ncols参数
ncols参数

mininterval参数

进度条更新的最小时间间隔,默认为 0.1 秒。如下图。

mininterval参数
mininterval参数

更新进度条,其实就是说重新出来一个进度条。

maxinterval参数

进度条更新的最大时间间隔,默认为 10 秒,与mininterval类似。

miniters参数

进度条更新的最小迭代次数,当设置为 0 时,根据 CPU 性能自适应,指定了最小迭代次数,则经过了多少次迭代之后就会更新进度条。

ascii参数

bool或者str,如果不指定或者指定为False,会有滑块填充,如上面的图,有黑色的滑块,如果指定ascii参数,则不会有滑块出现,而是以#填充,并且没有进行完的地方会以数字滚动显示。

disable参数

bool,默认为False,如果指定为True则禁用了整个进度条,如果设置为None,在不是 TTY(Teletypes,可以理解为在终端或者控制台上,不会禁用进度条)的情况下,禁用进度条。

经过尝试,在终端中设置为None,依然还是会显示进度条,而在 jupyter notebook 不会显示进度条。

unit参数

str,表示迭代次数的单位,默认是it,如下红色框框所示。

unit参数
unit参数

unit_scale参数

如果设定为1或者True,则会自适应数字单位,如下面的三万多变成了 37.5k。 unit_scale参数

dynamic_ncols参数

默认为False,如果设置了,则会自适应输出的宽ncols和高nrows

smoothing参数

默认为0.3,设置范围在 0 到 1 之间,表示速度估算的指数移动平均平滑因子,0为平均速度,1是当前速度/瞬时速度,表示的是在进度条变化的时候,显示的多少次迭代每秒是平均速度还是瞬时速度。(原话:Exponential moving average smoothing factor for speed estimates)

bar_format参数

进度条的格式,str,不同的进度条格式设置会影响性能,默认的格式是{l_bar}{bar}{r_bar},其中l_bar{desc}: {percentage:3.0f}%|r_bar|{n_fmt}/{total_fmt} [{elapsed}<{remaining},''{rate_fmt}{postfix},这里可以设置很多参数,如下vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, percentage, elapsed, elapsed_s, ncols, nrows, desc, unit, rate, rate_fmt, rate_noinv, rate_noinv_fmt, rate_inv, rate_inv_fmt, postfix, unit_divisor, remaining, remaining_s。 当没有设置desc参数的时候,后面的冒号:会被自动去掉。

initial参数

默认值为0,表示初始的迭代次数,常用于新开始一个进度条。如下图,从 3 开始,最后变成 50003 次迭代。

initial参数
initial参数

position参数

默认为0,如果设置为其他数(记为 N),它会在进度条前,先输出 N 个空行。

postfix参数

desc参数相似,desc是前缀,postfix是后缀

postfix参数
postfix参数

unit_divisor参数

迭代次数的除数,也可以理解为单位,默认为1000,当unit_scale参数为True的时候,忽略这个参数。

write_bytes参数

表示写入二进制字节编码还是unicode编码,默认为写入unicode编码,当write_bytes参数为True时,写入二进制字节编码。

lock_args参数

tuple类型,刷新中间输出,通过tqdm.refresh()方法,获得中间输出。

nrows参数

ncols参数类似,表示显示进度条的高度。

gui参数

将进度条使用matplotlib去画,进度条从字符串变成了图片。 不过不建议使用改参数,已经被tqdm.gui.tqdm(...)取代。

tqdm.update(n=1)方法

默认n=1,常用于手动更新迭代次数。

tqdm.close()方法

清除进度条,如果指定了leave=False,则进度条会被清理掉,反之还会留着。

tqdm.refresh(nolock=False, lock_args=None)方法

刷新进度条的显示。

tqdm.unpause()方法

重新开始打印时间,从上次停止的时间开始。

tqdm.reset(total=None)方法

重设total参数

tqdm.set_description(desc=None, refresh=True)方法

tqdm.set_description_str(desc=None, refresh=True)方法

重新设置desc参数,set_description_str方法,没有冒号:跟在desc参数后。

后面的一系列方法不再说明,大多数是重新设置初始化方法中的参数。

tqdm.trange()

tqdm.tqdm()类似,tqdm.trange()代替了tqdm(range(*args), **kwargs)

tqdm.notebook.tqdm()tqdm.notebook.trange()

notebook
notebook

IPythonJupyter Notebook中显示好看一些的进度条,使用方法和tqdm.tqdm()tqdm.trange()类似。

tqdm.gui.tqdm()tqdm.gui.trange()

用于 GUI 的进度条,使用方法和tqdm.tqdm()tqdm.trange()类似。

实验性模块

好像暂时还不能用。

tqdm.contrib.tenumerate()

类似于 python 内建的enumerate方法

tqdm.contrib.tzip()

类似于 python 内建的zip方法

tqdm.contrib.tmap()

类似于 python 内建的tmap方法

自适应打印

from tqdm.auto import tqdm, trange

会根据环境的不同,输出不同样式的进度条。如下图所示。

notebook
notebook
ipython
ipython

小结

依旧比较啰嗦,其实主要知道tqdm, trange的用法就行。

from tqdm.auto import tqdm, trange