Python 长期以来一直注重便利性和对程序员的友好性,但它并不是最快的编程语言。它的一些速度限制是由于其默认实现 cPython 是单线程的。也就是说,cPython 一次不会使用多个硬件线程。
虽然可以使用 Python 内置的模块threading
来加快速度,但threading
只会提供并发性,而不是并行性。它适用于运行不依赖于 CPU 的多个任务,但对于加速每个需要完整 CPU 的多个任务没有任何作用。
Python 也包含一种跨多个 CPU 运行的方式multiprocessing
。multiprocessing
模块会启动 Python 解释器的多个副本,每个副本都在一个单独的内核上运行,并提供用于跨内核拆分任务的方法。但有时这并不能满足实际需求。
有时,不仅需要跨多个内核分配工作,还需要跨多台机器分配工作。这就需要采用额外的计算库,下面介绍六个 Python库,将现有的 Python 应用程序工作分散到多个内核、多台机器或两者之间。
Ray由加州大学伯克利分校的一组研究人员开发,支持许多分布式机器学习库。但 Ray 不仅限于机器学习任务,任何 Python 任务都可以使用 Ray 分解并分布在系统之间。
Ray 的语法是最少的,因此您无需大量返工现有应用程序来并行化它们。所述@ray.remote
装饰分布到任何可用的节点该函数在一个雷群集,任选指定的参数对于许多CPU或GPU如何使用。每个分布式函数的结果都作为 Python 对象返回,因此它们易于管理和存储,并且节点之间或节点内的复制量保持在最低限度。例如,最后一个功能在处理 NumPy 数组时会派上用场。Ray 甚至包括它自己的内置集群管理器,它可以根据需要在本地硬件或流行的云计算平台上自动启动节点。
dask也是 Python 中的分布式并行计算库,具有自己的任务调度系统、对 NumPy 等 Python 数据兼容,具备从一台机器扩展到多台机器的能力。
Dask 以两种基本方式工作。第一种是通过并行化数据结构——本质上是 Dask 自己的 NumPy 数组、列表或 Pandas DataFrames 版本。将这些构造的 Dask 版本交换为它们的默认值,Dask 将自动将它们的执行分布到集群中。这通常只涉及更改导入的名称,但有时可能需要重写才能完全工作。
第二种方式是通过 Dask 的低级并行化机制,包括函数装饰器,它跨节点分配作业并同步(“立即”模式)或异步(“懒惰”)返回结果。两种模式也可以根据需要混合使用。
Dask 和 Ray 之间的一个主要区别是调度机制。Dask 使用集中式调度程序来处理集群的所有任务。Ray是分散式的,这意味着每台计算机都运行自己的调度程序,因此,与调度任务有关的任何问题都在单台计算机而不是整个群集的级别上进行处理。Dask 还提供了一种称为“actors.”的高级且仍在试验中的功能。Actor 是指向另一个 Dask 节点上的作业的对象。这样,需要大量本地状态的作业可以就地运行并由其他节点远程调用,因此不必复制作业的状态。Ray 没有像 Dask 的 actor 模型那样支持更复杂的工作分配。
Dispy允许一组机器上分发整个 Python 程序或单独的函数以进行并行执行。它使用平台原生机制进行网络通信以保持快速高效,因此 Linux、MacOS 和 Windows 机器同样可以正常工作。
Dispy 语法有点类似于multiprocessing
您显式创建一个集群(multiprocessing
您将在哪里创建一个进程池),向集群提交工作,然后检索结果。修改作业以使用 Dispy 可能需要做更多的工作,但您也可以精确控制这些作业的调度和返回方式。例如,您可以返回临时或部分完成的结果,将文件作为作业分发过程的一部分进行传输,并在传输数据时使用SSL 加密。
顾名思义,Pandaral·lel是一种跨多个节点并行化 Pandas 作业的方法。缺点是 Pandaral·lel仅适用 于 Pandas。但是,如果正在使用 Pandas,并且您所需要的只是一种在一台计算机上跨多个内核加速 Pandas 作业的方法,那么 Pandaral·lel 将专注于这项任务。
请注意,尽管Pandaral·lel确实可以在Windows上运行,但它只能从Windows子系统(适用于Linux)中启动的Python会话中运行。MacOS 和 Linux 用户可以按原样运行 Pandaral·lel。
Ipyparallel是另一个高度集中的多处理和任务分配系统,专门用于跨集群并行执行 Jupyter notebook 代码。已经在 Jupyter 中工作的项目和团队可以立即开始使用 Ipyparallel。
Ipyparallel 支持许多并行化代码的方法。最简单的是采用map
,它将任何函数应用于序列并在可用节点之间平均分配工作。对于更复杂的工作,通过装饰器装饰特定的功能以始终远程或并行运行。
Jupyter 笔记本支持“魔法命令”,用于仅在笔记本环境中才能执行的操作。Ipyparallel 添加了一些自己的魔法命令。例如,您可以为任何 Python 语句添加前缀%px
以自动对其进行并行化。
Joblib有两个主要目标:并行运行作业,如果没有任何变化,则不重新计算结果。这些效率使 Joblib 非常适合科学计算,在科学计算中,可重复的结果是神圣不可侵犯的。Joblib 的文档提供了大量有关如何使用其所有功能的示例。
用于并行化工作的 Joblib 语法非常简单——它相当于一个装饰器,可用于跨处理器拆分作业或缓存结果。并行作业可以使用线程或进程。
Joblib 包括用于计算作业创建的 Python 对象的透明磁盘缓存。如上所述,此缓存不仅可以帮助 Joblib 避免重复工作,还可以用于暂停和恢复长时间运行的作业,或者从崩溃后停止的作业处开始。缓存还针对 NumPy 数组等大型对象进行了智能优化。数据区域可以通过使用在同一系统上的进程之间在内存中共享numpy.memmap
。
Joblib 不提供在多台单独的计算机上分配作业的方法。从理论上讲,可以使用 Joblib 的管道来执行此操作,但使用本机支持它的其他框架可能更容易。
参考:https://www.infoworld.com/article/3542595/6-python-libraries-for-parallel-processing.html
Copyright © 2021 .长沙麦涛网络科技有限公司 All rights reserved.
湘ICP备20015126号-2
联系我们