(数据科学学习手札136)Python中基于joblib实现极简并行计算加速
本文示例代码及文件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
我们在日常使用Python
进行各种数据计算处理任务时,若想要获得明显的计算加速效果,最简单明了的方式就是想办法将默认运行在单个进程上的任务,扩展到使用多进程或多线程的方式执行。
而对于我们这些从事数据分析工作的人员而言,以最简单的方式实现等价的加速运算的效果尤为重要,从而避免将时间过多花费在编写程序上。而今天的文章费老师我就来带大家学习如何利用joblib
这个非常简单易用的库中的相关功能,来快速实现并行计算加速效果。
![](https://img2022.cnblogs.com/blog/1344061/202205/1344061-20220514194817119-481292134.jpg)
2 使用joblib进行并行计算
作为一个被广泛使用的第三方Python
库(譬如scikit-learn
项框架中就大量使用joblib
进行众多机器学习算法的并行加速),我们可以使用pip install joblib
对其进行安装,安装完成后,下面我们来学习一下joblib
中有关并行运算的常用方法:
2.1 使用Parallel与delayed进行并行加速
joblib
中实现并行计算只需要使用到其Parallel
和delayed
方法即可,使用起来非常简单方便,下面我们直接以一个小例子来演示:
joblib
实现并行运算的思想是将一组通过循环产生的串行计算子任务,以多进程或多线程的方式进行调度,而我们针对自定义的运算任务需要做的仅仅是将它们封装为函数的形式即可,譬如:
import time
def task_demo1():
time.sleep(1)
return time.time()
接着只需要像下面的形式一样,为Parallel()
设置相关参数后,衔接循环创建子任务的列表推导过程,其中利用delayed()
包裹自定义任务函数,再衔接()
传递任务函数所需的参数即可,其中n_jobs
参数用于设置并行任务同时执行的worker
数量,因此在这个例子中可以看到进度条是按照4个一组递增的,可以看到最终时间开销也达到了并行加速效果:
![](https://img2022.cnblogs.com/blog/1344061/202205/1344061-20220514194819296-72623538.gif)
其中可以根据计算任务以及机器CPU核心数具体情况为Parallel()
调节参数,核心参数有:
- backend:用于设置并行方式,其中多进程方式有
'loky'
(更稳定)和'multiprocessing'
两种可选项,多线程有'threading'
一种选项。默认为'loky'
- n_jobs:用于设置并行任务同时执行的worker数量,当并行方式为多进程时,
n_jobs
最多可设置为机器CPU逻辑核心数量,超出亦等价于开启全部核心,你也可以设置为-1
来快捷开启全部逻辑核心,若你不希望全部CPU资源均被并行任务占用,则可以设置更小的负数来保留适当的空闲核心,譬如设置为-2
则开启全部核心-1个核心,设置为-3
则开启全部核心-2个核心
譬如下面的例子,在我这台逻辑核心数为8的机器上,保留两个核心进行并行计算:
![](https://img2022.cnblogs.com/blog/1344061/202205/1344061-20220514194821274-811886942.gif)
关于并行方式的选择上,由于Python
中多线程时全局解释器锁的限制,如果你的任务是计算密集型,则推荐使用默认的多进程方式加速,如果你的任务是IO密集型譬如文件读写、网络请求等,则多线程是更好的方式且可以将n_jobs
设置的很大,举个简单的例子,可以看到,通过多线程并行,我们在5秒的时间里完成了1000次请求,远快于单线程17秒请求100次的成绩:
![](https://img2022.cnblogs.com/blog/1344061/202205/1344061-20220514194823618-182266811.png)
你可以根据自己实际任务的不同,好好利用joblib
来加速你的日常工作。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
相关文章
- Python学习--16 正则表达式
- Python快速学习09: 函数的参数
- 转-[Python 学习]2.5版yield之学习心得
- Python PIL.Image模块:图片变更尺寸大小(宽x高)
- 机器学习笔记 c#调用python脚本文件进行模型推理
- Python语言学习:Python语言学习之程序打包发布(exe/msi等)&如何将自己的Python项目(自定义程序代码库)发布到PyPI全流程的简介、案例应用之详细攻略
- Python编程语言学习:包导入和模块搜索路径(包路径)简介、使用方法(python系统环境路径的查询与添加)之详细攻略
- Python编程语言学习:一行代码利用enumerate函数把纯列表数据转为自带索引的字典数据,字典格式数据应用之key和value相互提取
- Python:利用python编程将上海十六区,2020年5月份房价实时地图(数据来源房天下)进行柱状图、热图可视化
- Python编程:利用python编程实现对基于时间序列的数据(dataframe格式)按照指定时间范围进行单方向关联,不存在的日期补充为默认的NaN
- Python语言编程学习:利用python输出当前python版本、MSC版本型号
- Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略
- Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例(增删改查排序之选择指定列、根据条件选择特定数据、赋值、列名重命名、修改列数据、处理缺失值、列合并、分组之详细攻略
- 已解决2. Set PROTOCOL_BUPFERS_PYTHON_iMPLEMENTATION=python (but this will use pure-Python parsing and w
- Python 实现个人博客系统(附零基础python学习资料)
- 没错!经典教材《统计学习导论》现在有了 Python版!
- Python学习86:海龟绘图
- Python学习38:面向对象编程
- Python: yield, python 实现tail -f
- Python开发学习之Python用三十行代码,打造一款简单的人工语音对话
- python学习===将py文件从打包成exe程序
- 零基础应该选择学习 java、php、前端 还是 python?
- Python学习笔记六之字符串操作:遍历、切割、查找等
- Python学习笔记一之简介、基础语法、数据类型转换