Python六大并行神器

为什么Python比较慢

Python在便利性和对程序员的友好性方面很有优势,但它并不是最快的编程语言。它的速度限制很大程度取决于编译器,cPython,是单线程的。也就是说,cPython在同一时间不会使用超过一个硬件线程。最终的结果是一核有难,多核围观。
在这里插入图片描述

虽然你可以使用Python中的threading模块来加快速度,但该模块只给你提供了并发性,而不是并行性。它有利于运行不依赖CPU的多个任务,但对加快每个任务都需要一个完整的CPU的速度没有任何作用。

Python 确实包含了一种在多个 CPU 上运行 Python 工作负载的本地方法。multiprocessing模块启动了多个 Python 解释器副本,每个副本都在一个单独的核心上,并提供了跨核心分割任务的基元(primitive,指机器指令和翻译的最小的或最基本单位)。但有时即使是该模块也是不够的。

有时,工作不仅需要在多个核心上分配工作,而且还需要在多个机器上分配。这就是这六个Python库和框架的用武之地。下面的六个Python工具包都允许你将现有的Python应用程序分散到多个核心、多个机器上。

Ray

Ray由加州大学伯克利分校的一个研究团队开发,是许多分布式机器学习库的基础。但Ray并不局限于机器学习任务,即使这是它最初的用例。任何Python任务都可以用Ray分解并分布在各个系统中。

Ray的语法是最小的,所以你不需要广泛地重做现有的应用程序来并行化它们。@ray.remote装饰器将该函数分布在Ray集群中的任何可用节点上,并可选择指定使用多少个CPU或GPU的参数。每个分布式函数的结果都以Python对象的形式返回,所以它们很容易管理和存储,而且在节点之间或节点内部的复制量也保持在最低水平。例如,在处理NumPy数组时,这最后一个功能就很方便。

Ray甚至包括它自己的内置集群管理器,它可以根据需要在本地硬件或流行的云计算平台上自动启动节点。
达斯克
从外观上看,Dask很像Ray。它也是一个在Python中进行分布式并行计算的库,有自己的任务调度系统,对NumPy等Python数据框架的认识,以及从一台机器扩展到多台机器的能力。

Dask

Dask以两种基本方式工作。第一种是通过并行的数据结构–本质上,Dask 自己的 NumPy 数组、列表或 Pandas DataFrames 版本。将这些结构的Dask版本换成其默认版本,Dask就会自动将其执行分散到你的集群中。这通常只涉及改变导入的名称,但有时可能需要重写才能完全工作。

第二种方式是通过Dask的底层并行化机制,包括函数装饰器,将工作分散到各个节点,并同步("即时 "模式)或异步(“懒惰”)地返回结果。这两种模式也可以根据需要进行混合。

Dask和Ray的一个关键区别是调度机制。Dask使用一个集中的调度器,处理集群的所有任务。Ray是分散的,这意味着每台机器都运行自己的调度器,所以任何与调度任务有关的问题都是在个别机器的层面上处理,而不是整个集群。

Dask还提供了一个先进的、仍在试验的功能,叫做 “演员”(actors)。一个演员是一个指向另一个Dask节点上的工作的对象。这样,一个需要大量本地状态的工作就可以在原地运行,并被其他节点远程调用,这样工作的状态就不必被复制。Ray缺乏像Dask的角色模型那样的东西来支持更复杂的作业分配。

Dispy

Dispy可以让你把整个Python程序或单个函数分布在一个机器集群上进行并行执行。它使用平台原生的网络通信机制来保持事情的快速和高效,因此Linux、MacOS和Windows机器都能很好地工作。

Dispy的语法有点类似于多处理,即你明确地创建一个集群(多处理会让你创建一个进程池),向集群提交工作,然后检索结果。要修改作业以使用Dispy,可能需要更多的工作,但你也获得了对这些作业如何被分派和返回的精确控制。例如,你可以返回临时或部分完成的结果,作为作业分配过程的一部分传输文件,并在传输数据时使用SSL加密。

Pandaral-lel

Pandaral-lel,顾名思义,是一种将Pandas作业在多个节点上并行化的方法。缺点是,Pandaral-lel只适用于Pandas。但如果你使用的是Pandas,而你所需要的只是在一台电脑上的多个核心上加速Pandas作业的方法,那么Pandaral-lel就可以专注于这个任务。

请注意,虽然Pandaral-lel确实可以在Windows上运行,但它只能从Windows Subsystem for Linux中启动的Python会话中运行。MacOS和Linux用户可以按原样运行Pandaral-lel。

并行系统(Ipyparallel)

Ipyparallel是另一个密切关注的多处理和任务分配系统,专门用于在集群中并行执行Jupyter笔记本代码。已经在Jupyter中工作的项目和团队可以立即开始使用Ipyparallel。

Ipyparallel支持多种方法来并行化代码。在简单的一端,有map,它将任何函数应用于一个序列,并将工作平均分配到可用的节点。对于更复杂的工作,你可以装饰特定的函数,使其总是远程或并行地运行。

Jupyter笔记本支持只有在笔记本环境下才能实现的 “魔法命令”。Ipyparallel增加了一些自己的神奇命令。例如,你可以在任何Python语句前加上%px来自动并行化它。

Joblib

Joblib有两个主要目标:并行运行作业,如果没有任何变化,就不要重新计算结果。这些效率使Joblib非常适合于科学计算,因为可重复的结果至关重要。Joblib的文档提供了大量关于如何使用其所有功能的例子。

Joblib用于并行化工作的语法非常简单–它相当于一个装饰器,可以用来在处理器之间分割作业,或缓存结果。并行作业可以使用线程或进程。

Joblib包括一个透明的磁盘缓存,用于由计算作业创建的Python对象。这个缓存不仅可以帮助Joblib避免重复工作,如上所述,而且还可以用来暂停和恢复长期运行的作业,或者在作业崩溃后重新开始。缓存还为大型对象(如NumPy数组)进行了智能优化。通过使用numpy.memmap,数据区域可以在同一系统的进程之间进行内存共享。

有一点Joblib没有提供的是在多个独立的计算机上分配作业的方法。在理论上,可以使用Joblib的管道来做这件事,但可能更容易使用另一个框架来支持它。

参考

6 Python libraries for parallel processing

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值