【日常小结】python模块--tqdm

 

今天总结一下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`参数

file参数

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

`file`参数

ncols参数

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

`ncols`参数

mininterval参数

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

`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_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`参数

position参数

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

postfix参数

desc参数相似,desc是前缀,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

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

ipython

小结

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

from tqdm.auto import tqdm, trange