Skip to content

并行

一个简单高效的工具,用于在所有可用CPU上并行化Pandas操作。


pandarallel 是一个简单而高效的工具,用于在所有可用的CPU上并行化Pandas操作。

只需一行代码更改,这使得任何Pandas用户都可以利用他的多核计算机,而pandas只使用一个核心。

pandarallel 还提供了不错的进度条(可在Notebook和终端上使用),以便大致了解剩余的计算量。

没有并行化 Without Pandarallel
通过并行化 With Pandarallel

特点

pandarallel 当前实现以下 pandas API:

没有并行化 有并行化
df.apply(func) df.parallel_apply(func)
df.applymap(func) df.parallel_applymap(func)
df.groupby(args).apply(func) df.groupby(args).parallel_apply(func)
df.groupby(args1).col_name.rolling(args2).apply(func) df.groupby(args1).col_name.rolling(args2).parallel_apply(func)
df.groupby(args1).col_name.expanding(args2).apply(func) df.groupby(args1).col_name.expanding(args2).parallel_apply(func)
series.map(func) series.parallel_map(func)
series.apply(func) series.parallel_apply(func)
series.rolling(args).apply(func) series.rolling(args).parallel_apply(func)

要求

LinuxmacOS 上,没有特殊要求。

Windows 上,由于多进程系统(spawn),您发送给 pandarallel 的函数必须是 自包含 的,并且不应依赖于外部资源。

示例:

✅ 在Mac和Linux上有效 - ❌ 在Windows上禁止

import math

def func(x):
    # Here, `math` is defined outside `func`. `func` is not self contained.
    return math.sin(x.a**2) + math.sin(x.b**2)

在任何地方有效

def func(x):
    # Here, `math` is defined inside `func`. `func` is self contained.
    import math
    return math.sin(x.a**2) + math.sin(x.b**2)

警告

并行化是有成本的(实例化新进程,通过共享内存发送数据,...),因此只有当需要并行化的计算量足够大时,并行化才是高效的。对于非常少量的数据,使用并行化并不总是值得的。

警告

显示进度条是有成本的,可能会稍微增加计算时间。

示例

每个可用的 pandas API 的示例可用:

基准测试

以下是一些示例,包括使用和不使用Pandaral·lel的比较基准。

用于此基准测试的计算机:

  • 操作系统: Linux Ubuntu 16.04
  • 硬件: Intel Core i7 @ 3.40 GHz - 4 核心

Benchmark

对于那些给定的示例,并行操作的运行速度大约是标准操作的4倍(除了series.map,它的运行速度仅快3.2倍)。

我何时应该使用 pandaspandarallelpyspark

根据 pandas 文档

pandas 是一个快速、强大、灵活且易于使用的开源数据分析和操作工具,建立在 Python 编程语言之上。

主要的 pandas 缺点是它只使用你电脑的一个核心,即使有多个核心可用。

pandarallel 通过使用计算机的所有核心来绕过这个限制。
但是,作为回报,pandarallel 需要标准 pandas 操作通常使用的两倍内存。

==> pandarallel 如果您的数据无法放入内存中,则不应使用 pandas。在这种情况下,spark(及其pythonpyspark)将是合适的。

spark 的主要缺点是 spark API 对用户来说不如 pandas API 方便(尽管这在改善),而且你还需要在你的计算机上安装一个 JVM(Java 虚拟机)。

然而,使用 spark 你可以:

  • 处理比您内存大得多的数据
  • 使用 spark 集群,将计算分布到多个节点上。