我们在日常使用 Python 进行各种数据计算处理任务时,若想要获得明显的计算加速效果,最简单明了的方式就是想办法将默认运行在单个进程上的任务,扩展到使用多进程或多线程的方式执行。

而对于我们这些从事数据分析工作的人员而言,以最简单的方式实现等价的加速运算的效果尤为重要,从而避免将时间过多花费在编写程序上。

而今天我就来带大家学习如何利用 joblib 这个非常简单易用的库中的相关功能,来快速实现并行计算加速效果。 喜欢记得收藏、点赞、关注。

文末提供完整代码、数据、技术沟通
图片

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个一组递增的,可以看到最终时间开销也达到了并行加速效果:
图片

其中可以根据计算任务以及机器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来加速你的日常工作。

技术交流、求职内推、干货汇总、与 3000+来自阿里、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

目前开通了技术交流群,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、添加微信号:dkl88191,备注:来自CSDN
  • 方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
Python官方的解释器是CPython,执行速度较慢,网上目前有许多PyPy和CPython的性能对比,PyPy比CPython快近25倍。原因是PyPy采用了先进的JIT编译器优化。        官网上的对比图:        先不扯淡了,知道你们可能听不懂。拐入正题。        官网:https://www.pypy.org/        最新版本的下载地址:http://buildbot.pypy.org/mirror/pypy3.6-v7.3.0rc3-win32.zip ,建议使用迅雷等下载工具下载。        下载完了直接解压,然后开始配置。        1.最起码 深度学习中,我们常常需要处理海量的数据 所以为了节约时间,要充分压榨CPU/GPU的计算能力,那并行处理是不可少的! 而万能的 Python 自带一个非常简单易用并行处理模块:multiprocessing,这里介绍其中一种用法 这种用法非常适合嵌入到深度学习数据处理中 程序实现: from multiprocessing import cpu_count, Pool import numpy as np import time # cpu 数量 cores = cpu_count() # 分块个数 Python 进行数据处理的时候,因为有GIL锁,因此多线程也只能使用一个处理器,这样经常出现程序运行只使用了一个CPU核心在运算,导致数据处理需要比较长的时间。如果将多个CPU核心同时参与运算,可以大幅度运算速度,下面讨论原则上不修改程序而发挥多CPU效率方案。 嗨喽,大家好呀~这里是爱看美女的茜茜呐又到了学Python时刻~在我们爬取数据的时候,有时候它运行速度会非常慢那么怎么解决呢?这里给大家带来一个多线程的方法我们用采集二手车来举例。 在Python编码中我们经常讨论的一个方面就是如何优化模拟执行的性能。尽管在考虑量化代码时NumPy、SciPy和pandas在这方面已然非常有用,但在构建事件驱动系统时我们无法有效地使用这些工具。有没有可以加速我们代码的其他办法?答案是肯定的,但需要留意! 在这篇文章中,我们看一种不同的模型-并发,我们可以将它引入我们Python程序中。这种模型在模拟中工作地特别好,它不需要共享状态。Mont 前言加州大学伯克利分校实时智能安全执行实验室(RISELab)的研究人员已开发出了一种新的分布式框架,该框架旨在让基于Python机器学习和深度学习工作负载能够实时执行,并具有类似消息传递接口(MPI)的性能和细粒度。这种框架名为Ray,看起来有望取代Spark,业界认为Spark对于一些现实的人工智能应用而言速度太慢了;过不了一年,Ray应该会准备好用于生产环境。 目前ray已经发布了0.3. Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。传统的例子简单搜索下"Python 多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子:import os import ... 下面对于一个分析模型给出相应的并行Python Parallel)及多线程(Theard)版本, 为了学术上的代码保密使用了代码混淆工具对代码进行了加密,主要关注点在于如何进行 并行及多线程重组。 下面是示例代码: from __future__ import division #line:1 import numpy as O0OO00000O0O0OO00 #line:2 目前在深度学习与图像处理领域,常常需要对大量图片进行批量处理。若按照常规的脚本编写方法进行处理,往往会消耗大量时间。这里我教大家一个非常简单的方法实现脚本并行,最大化利用你的多核cpu来n倍加速你的脚本。 我们举例来说明: 首先,我们在这里处理19000多张图片,将他们统一resize到16x16。我们立刻会想到使用for循环来完成,代码如下: import cv2,glob,dateti... python性能提升之并行处理for循环 from multiprocessing import Pool from multiprocessing.dummy import Pool 现在的电脑的CPU一般都有多个核心,在Python中可以使用 multiprocessing 包比较方便地实现将计算任务分配给多个核心,使之并行地计算以实现加速的效果。 一般主要会用到的语法有 获取CPU的核心数: n_cpu = multiprocessing.cpu_count() 并行执行函数: proc = multiprocessing.Process(target=sin... 云哥前期从以下九个方面讨论了加速Python的具体方法,一共24个,每个都带有优化前后的对比,非常实用。分析代码运行时间加速查找加速循环加速函数实用标准库加速Numpy向...