我们在日常使用
Python
进行各种数据计算处理任务时,若想要获得明显的计算加速效果,最简单明了的方式就是想办法将默认运行在单个进程上的任务,扩展到使用多进程或多线程的方式执行。
而对于我们这些从事数据分析工作的人员而言,以最简单的方式实现等价的加速运算的效果尤为重要,从而避免将时间过多花费在编写程序上。而今天的文章费老师我就来带大家学习如何利用
joblib
这个非常简单易用的库中的相关功能,来快速实现并行计算加速效果。
使用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个一组递增的,可以看到最终时间开销也达到了并行加速效果:
其中可以根据计算任务以及机器CPU核心数具体情况为
Parallel()
调节参数,核心参数有:
-
backend:用于设置并行方式,其中多进程方式有
'loky'
(更稳定)和
'multiprocessing'
两种可选项,多线程有
'threading'
一种选项。默认为
'loky'
-
n_jobs:用于设置并行任务同时执行的worker数量,当并行方式为多进程时,
n_jobs
最多可设置为机器CPU逻辑核心数量,超出亦等价于开启全部核心,你也可以设置为
-1
来快捷开启全部逻辑核心,若你不希望全部CPU资源均被并行任务占用,则可以设置更小的负数来保留适当的空闲核心,譬如设置为
-2
则开启全部核心-1个核心,设置为
-3
则开启全部核心-2个核心
譬如下面的例子,在我这台逻辑核心数为8的机器上,保留两个核心进行并行计算:
关于并行方式的选择上,由于
Python
中多线程时全局解释器锁的限制,如果你的任务是计算密集型,则推荐使用默认的多进程方式加速,如果你的任务是IO密集型譬如文件读写、网络请求等,则多线程是更好的方式且可以将
n_jobs
设置的很大,举个简单的例子,可以看到,通过多线程并行,我们在5秒的时间里完成了1000次请求,远快于单线程17秒请求100次的成绩(此例仅供参考,大家在学习尝试时请不要过于频繁访问他人的网站):
你可以根据自己实际任务的不同,好好利用
joblib
来加速你的日常工作。
AI卷到艺术界了,DALL·E将战胜人类?
Pandas 与 SQL 的超强结合,爆赞!
云上风景虽好,但不要盲目跟风!
Python 字符串深度总结
作者 | 费弗里来源 | Python大数据分析简介我们在日常使用Python进行各种数据计算处理任务时,若想要获得明显的计算加速效果,最简单明了的方式就是想办法将默认运行在单个进程上的任务,扩展到使用多进程或多线程的方式执行。而对于我们这些从事数据分析工作的人员而言,以最简单的方式实现等价的加速运算的效果尤为重要,从而避免将时间过多花费在编写程序上。而今天的文章费老师我...
该项目的目的是为concurrent.futures的ProcessPoolExecutor类提供一个健壮的,跨平台和跨版本的实现。 它的显着特点是:
一致且健壮的生成行为:在POSIX系统上,所有进程都使用fork + exec启动。 这样可确保与第三方库的交互更加安全。 相反, multiprocessing.Pool默认情况下使用不带exec的fork,从而导致第三方运行时崩溃(例如,OpenMP,macOS Accelerate ...)。
可重复使用的执行程序:避免每次重新生成完整的执行程序的策略。 单例执行程序实例可以在连续调用之间重用(并在必要时动态调整大小),以限制生成和关闭开销。 可配置的空闲超时后,可以自动关闭工作进程,以释放系统资源。
透明的cloudpickle集成:
并行
调用交互式定义的函数和lambda表达式。 还可以注册自定义Pi
Python
之
并行
–基于joblib
Python
的
并行
远不如Matlab好用。比如Matlab里面
并行
就直接把for改成parfor就行(当然还要注意迭代时下标的格式),而
Python
查 一查
并行
,各种乱七八糟的方法一大堆,而且最不爽的一点就是只能对函数进行
并行
。
当然,这点困难也肯定不能就难倒我们,该克服也得克服,毕竟从本质上讲,也就只是实现的方式换一换而已。
大名鼎鼎的sklearn里面集成了很方便的
并行
计算,这在之前的机器学习教程里面也有12
仔细查看其代码发现就是用joblib实现的,并且用法还挺
Joblib提供了一个
简单
的帮助类来编写
并行
化的循环。其核心思想是把代码写成生成器表达式的样子,然会再将它转换为
并行
计算:
from math import sqrt
[sqrt(i ** 2) for i in range(10)]
使用以下方式,可将计算分布到两个CPU上:
from math import sqrt
from joblib import Parallel, delayed
jenkins的
pip
line为用户提供了更自由的任务配置方式,支持groovy语言。任务需要支持多台slave
并行
执行任务,并通过api传参远程触发,下面mark下设置方法:
首先点击新建任务->选择“流水线” 填写任务名称并点击确定
随机森林的
并行
写完了。大致采用了两种方法:
1)一种是
python
并行
(1)
中
提到的joblib的parallel和delayed方法(具体实现是直接使用sklearn.externals.joblib,因为sklearn优化得很好)
2)第二种是采用http://www.parallel
python
.com/的SMP
两者编程都很
简单
,但效率相差还是挺大的,这里大概贴出三者的编程
我们在日常使用
Python
进行各种数据计算处理任务时,若想要获得明显的计算
加速
效果,最
简单
明了的方式就是想办法将默认运行在单个进程上的任务,扩展到使用多进程或多线程的方式执行。
而对于我们这些从事
数据分析
工作的人员而言,以最
简单
的方式实现等价的
加速
运算的效果尤为重要,从而避免将时间过多花费在编写程序上。
而今天我就来带大家学习如何利用joblib这个非常
简单
易用
的库
中
的相关功能,来快速实现
并行
计算
加速
效果。喜欢记得收藏、点赞、关注。
文末提供完整代码、数据、技术沟通
2 使用joblib进行
并行
计算
本文将介绍
Python
分布式
并行
编程模块Parallel
python
(简称PP),pp-1.6.4.4的使用。
PP是一个
python
模块,提供在SMP(多处理器或多核)和集群(通过网络连接的计算机)上
并行
执行
python
代码的机制。
PP模块克服了GIL(全局解释器锁)这个限制,并提供了一种写
并行
python
应用程序的
简单
方法。内部ppsmp使用进程和IPC(进程间通信)来组织
并行
计算。后者的所有细节和复杂性完全被隐藏,应用程序只需负责提交作业并检索其结果(写
并行
应用程序的最
简单
的方法)。跨平...
Joblib是一个可以将
Python
代码转换为
并行
计算模式的包,可以大大简化我们写
并行
计算代码的步骤。我们可以通过操作该包内的函数来实现目标代码的
并行
计算,从而提高代码运行效率。下面举一个
简单
的例子来说明:
1、首先,我们定义一个
简单
的函数single(a),该函数顺序执行休眠1s然后打印a的值的操作:
def single(a):
""" 定义一个
简单
的函数 """
time.sleep(1) # 休眠1s
print(a) # 打印出a
2、我们使用for