1.简介当我们使用Python执行各种数据处理任务时,如果想获得明显的计算加速效果,最简单明了的方法就是想办法将默认运行在单个进程上的任务扩展为在多个进程中执行或者线程。对于我们这些从事数据分析的人来说,以最简单的方式达到等效加速运算的效果尤为重要,这样可以避免在编写程序上花费过多的时间。在今天的文章中,费老师就带大家学习如何使用joblib这个非常简单易用的库中的相关函数,快速实现并行计算的加速效果。2.使用joblib进行并行计算作为一个广泛使用的第三方Python库(例如scikit-learn项目框架大量使用joblib进行很多机器学习算法的并行加速),我们可以使用pipinstalljoblib来安装,之后安装完成,我们来了解一下joblib中并行计算的常用方法:2.1使用Parallel和delayed进行并行加速在joblib中,只需要使用它的Parallel和delayed方法,使用起来非常简单方便,如下直接用一个小例子来演示:joblib实现并行计算的思路是将一组通过循环产生的串行计算子任务以多进程或者多线程的方式进行调度,对于自定义的计算任务我们需要做的唯一的就是将它们封装成函数的形式,例如:importtimedeftask_demo1():time.sleep(1)returntime.time()然后你只需要设置相关的参数forParallel()如下形式,连接循环创建子任务的列表推导过程,使用delayed()包装自定义任务函数,然后connect()传递任务函数需要的参数,其中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个请求要快很多(这个例子仅供参考,大家在学习中totryPleasedon'tvisitotherpeople'swebsitestoofrequently):你可以根据自己的实际任务,善用joblib来加速你的日常工作。
