(数据科学学习手札91)在Python中妥善使用进度条
本文示例代码已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
在日常运行程序的过程中常常涉及到循环迭代过程,对于执行时间很短的程序来说倒无所谓,但对于运行过程有明显耗时的涉及循环迭代的程序,为其加上进度条(progress bar),是帮助我们监测代码执行进度以及处理中间异常错误非常实用的技巧。
图1
本文就将为大家介绍Python
中非常实用又风格迥异的两个进度条相关库——tqdm
与alive-progress
的主要用法。
2 tqdm常用方法
tqdm
是Python
中所有进度条相关库中最出名的,既然是最出名的,自然有它独到之处。
tqdm
不仅可以生成基础的可在终端中显示的进度条,还可以配合jupyter notebook
和jupyter lab
生成更加美观的网页交互部件形式的进度条,更是和pandas
强强联手,为pandas
中的一些操作提供专有的进度条功能。
下面我们来对tqdm
的主要功能进行介绍。
2.1 基础用法
因为是第三方库,首先需要利用pip install tqdm
或 conda install -c conda-forge tqdm
对其进行安装,安装完成后先来看看它最基本的用法:
图2
利用tqdm.tqdm
,将for
循环过程中进行迭代的对象简单包裹,就实现了为循环过程添加进度条以及打印执行速度、已运行时间与预估剩余运行时间等实用信息的功能,同样也可用于列表推导:
图3
而针对迭代对象是range()
的情况,tqdm
还提供了简化版的trange()
来代替tqdm(range())
:
图4
其附带的参数desc
还可以帮助我们设置进度条的说明文字:
图5
而如果想要在迭代过程中变更说明文字,还可以预先实例化进度条对象,在需要刷新说明文字的时候执行相应的程序:
图6
但当迭代的对象长度一开始未知时,譬如对pandas
中的DataFrame.itertuples()
进行迭代,我们就只能对其执行速度等信息进行估计,但无法看到进度条递增情况,因为tqdm
不清楚迭代的终点如何:
图7
2.2 配合jupyter notebook/jupyter lab的美观进度条
tqdm
对jupyter notebook
和jupyter lab
有着特殊的支持,且使用方法非常简单,只需要将原有的from tqdm import XXX
的相应功能导入格式修改为from tqdm.notebook import XXX
就可以了,以trange
为例:
图8
2.3 配合pandas中的apply
tqdm
对pandas
中的apply()
过程提供了特殊的支持,因为pandas
中的apply()
本质上就是串行循环运算,你可以将pandas
中的任何apply
操作替换为progress_apply
,并且记住每个单独的progress_apply
前要先执行tqdm.pandas()
,就像下面的例子一样:
图9
3 alive-progress常用方法
虽然与tqdm
一样都是为了给循环过程加上进度条而诞生的库,但alive-progress
相比tqdm
增加了更多花样繁多的动态效果,我们通过调用其专门提供的showtime()
函数可以查看所有可用的动态进度条样式:
图10
同样类似地可以查看所有进度条样式:
图11
使用起来也是非常简单,但与tqdm
用法区别很大,需要配合with
关键词,譬如下面我们使用到alive_progress
中的alive_bar
来生成动态进度条:
图12
通过修改bar
参数来改变进度条的样式:
图13
更多关于alive-progress
的内容感兴趣的朋友可以查看官方说明:(https://github.com/rsalmei/alive-progress),但比较遗憾的是目前的alive-progress
只能在终端中运行,还没有为jupyter
开发更美观的交互式部件,但你可以在譬如网络爬虫等任务中使用它,效果也是很不错的。
以上就是本文的全部内容,如有疑问欢迎在评论区与我讨论~
- 集成算法的简单分享
- 5分钟看懂模块 || 数说 · 语言
- Code | Python30个编程技巧!
- 亚马逊AI主任科学家李沐:机器学习简介
- 什么是负载均衡?
- 推荐|14种模型设计帮你改进你的卷积神经网络(CNN)!
- 【源码】Python的开源人脸识别库:离线识别率高达99.38%
- 如何使用深度学习去除人物图像背景
- 开源|人脸检测的C / C ++源代
- Python高性能计算库——Numba
- 最新|官方发布:TensorFlow 数据集和估算器介绍
- 干货 | PyTorch相比TensorFlow,存在哪些自身优势?
- 用TensorFlow和TensorBoard从零开始构建ConvNet(CNN)
- 从零开始:手把手教你安装深度学习操作系统、驱动和各种python库!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义ToolBar并实现沉浸式的方法
- python初学者笔记—入门基础知识
- Android SurfaceView画板操作
- Android利用Andserver搭建服务器的详细教程
- 位运算处理进制转换问题
- python的to_sql那点儿事
- Android自定义控件之刻度尺控件
- Android 使用Vibrator服务实现点击按钮带有震动效果
- sprintf函数的使用
- Android实现定时任务及闹钟
- Android使用ftp方式实现文件上传和下载功能
- slenium模拟登陆知乎2020
- Android两种轮询的实现方法
- 汉诺塔问题
- Android实现雷达View效果的示例代码