(IN1*IN2+IN3)MOD IN4是这么计算的

原标题:一行代码将Pandas加速4倍

文章發布于公号【数智物语】 (ID:decision_engine)关注公号不错过每一篇干货。

导读:虽然Pandas的功能非常强大但是对于大数据集来说,确实是很慢的

虽嘫 panda 是 Python 中用于数据处理的库,但它并不是真正为了速度而构建的了解一下新的库 Modin,Modin 是为了分布式 panda 的计算来加速你的数据准备而开发的

Pandas是處理 Python 数据的首选库。它易于使用并且在处理不同类型和大小的数据时非常灵活。它有大量的函数使得操纵数据变得轻而易举。

随着时間的推移各种Python包的流行程度

但是有一个缺点:对于较大的数据集来说,panda“慢”

默认情况下,panda 使用单个 CPU 内核作为单个进程执行其函数這对于较小的数据集工作得很好,因为你可能不会注意到速度上的差异但是,随着数据集越来越大计算量越来越大,如果只使用单个 cpu 核速度会受到很大的影响。它在数据集上同一时间只能计算一次但该数据集可以有数百万甚至数十亿行。

然而大多数用于数据科学嘚现代机器都有至少 2 个 CPU 核。这意味着以 2 个 CPU 核为例,在使用 pandas 时50%或更多的计算机处理能力在默认情况下不会执行任何操作。当你使用 4 核(现玳 Intel i5)或 6 核(现代 Intel i7)时情况会变得更糟。pandas 的设计初衷并不是为了有效利用这种计算能力

Modin是一个新的库,通过在系统所有可用的 CPU 核上自动分配计算来加速 pandas有了它,对于任何尺寸的 pandas 数据数据集Modin 声称能够以 CPU 内核的数量得到近乎线性的加速。

让我们看看它是如何工作的并通过一些玳码示例进行说明。

给定 pandas 中的 DataFrame 我们的目标是以尽可能快的方式对其执行某种计算或处理。可以用*.mean()取每一列的平均值用groupby对数据进行分组,用drop_duplicates()*删除所有重复项或者使用其他任何内置的 pandas 函数。

在前一节中我们提到了 pandas 如何只使用一个 CPU 核进行处理。自然这是一个很大的瓶颈,特别是对于较大的 DataFrames计算时就会表现出资源的缺乏。

理论上并行计算就像在每个可用的 CPU 核上的不同数据点上应用计算一样简单。对于┅个 pandas 的 DataFrame一个基本的想法是将 DataFrame 分成几个部分,每个部分的数量与你拥有的 CPU 内核的数量一样多并让每个 CPU 核在一部分上运行计算。最后我們可以聚合结果,这是一个计算上很 cheap 的操作

多核系统如何更快地处理数据。对于单核进程(左)所有10个任务都放在一个节点上。对于双核進程(右图)每个节点承担5个任务,从而使处理速度加倍

这正是 Modin 所做的。它将 DataFrame 分割成不同的部分这样每个部分都可以发送到不同的 CPU 核。Modin 茬行和列之间划分 DataFrame这使得 Modin 的并行处理可扩展到任何形状的 DataFrame。

想象一下如果给你一个列多行少的 DataFrame。有些库只执行跨行分区在这种情况丅效率很低,因为我们的列比行多但是对于 Modin 来说,由于分区是跨两个维度进行的所以并行处理对于所有形状的数据流都是有效的,不管它们是更宽的(很多列)、更长的(很多行)还是两者都有。

panda的DataFrame(左)存储为一个块只发送到一个CPU核。Modin的DataFrame(右)跨行和列进行分区每个分区可以发送到不同的CPU核上,直到用光系统中的所有CPU核

上面的图是一个简单的例子。Modin 实际上使用了一个“分区管理器”它可以根据操作的类型改變分区的大小和形状。例如可能有一个操作需要整个行或整个列。在这种情况下“分区管理器”将以它能找到的最优方式执行分区和汾配到 CPU 核上。它是非常灵活的

为了在执行并行处理时完成大量繁重的工作,Modin 可以使用 Dask 或 Ray它们都是使用 Python api 的并行计算库,你可以选择一个戓另一个在运行时与 Modin 一起使用Ray 目前是最安全的一个,因为它更稳定 —— Dask 后端是实验性的

已经有足够的理论了。让我们来看看代码和速喥基准测试!

安装 Modin 的最简单的方法是通过 pip下面的命令安装 Modin、Ray 和所有相关的依赖项:

我们要做的第一个测试是使用 read_csv()读取数据。Pandas 和 Modin 的代码是唍全一样的

为了测量速度,我导入了time模块并在read_csv()之前和之后放置了一个time()。panda 将数据从 CSV 加载到内存需要 8.38 秒而 Modin 需要 3.22 秒。这是 2.6 倍的加速对于呮修改 import 语句来说,这不算太寒酸!

让我们在 DataFrame 上做一些更复杂的处理连接多个 DataFrames 是 panda 中的一个常见操作 — 我们可能有几个或多个包含数据的 CSV 文件,然后必须一次读取一个并连接它们我们可以使用 panda 和 Modin 中的*pd.concat()*函数轻松做到这一点。

我们希望 Modin 能够很好地处理这种操作因为它要处理大量的数据。代码如下所示

在上面的代码中,我们将 DataFrame 与自身连接了 5 次pandas 在 3.56 秒内完成了连接操作,而 Modin 在 0.041 秒内完成速度提高了 86.83 倍!看起来,即使我们只有 6 个 CPU 核心DataFrame 的分区也有助于提高速度。

用于 DataFrame 清洗的 panda 函数是*.fillna()*函数此函数查找 DataFrame 中的所有 NaN 值,并将它们替换为你选择的值panda 必须遍曆每一行和每一列来查找 NaN 值并替换它们。这是一个应用 Modin 的绝佳机会因为我们要多次重复一个非常简单的操作。

Modin 总是这么快吗

在有些情況下,panda 实际上比 Modin 更快即使在这个有 5,992,097(近 600 万)行的大数据集上也是如此。下表显示了我进行的一些实验中 panda 与 Modin 的运行时间

正如你所看到的,在某些操作中Modin 要快得多,通常是读取数据并查找值其他操作,如执行统计计算在 pandas 中要快得多。

Modin 仍然是一个相当新的库并在不断地发展和扩大。因此并不是所有的 pandas 功能都被完全加速了。如果你在 Modin 中尝试使用一个还没有被加速的函数它将默认为 panda,因此不会有任何代码錯误或错误

默认情况下,Modin 将使用计算机上所有可用的 CPU 内核在某些情况下,你可能希望限制 Modin 可以使用的 CPU 内核的数量特别是如果你希望茬其他地方使用这种计算能力。我们可以通过 Ray 中的初始化设置来限制 Modin 可以访问的 CPU 内核的数量因为 Modin 在后端使用它。

在处理大数据时数据集的大小超过系统上的内存(RAM)的情况并不少见。Modin 有一个特殊的标志我们可以设置为“true”,这将使其进入“out of core”模式这意味着 Modin 将使用你的磁盤作为你的内存溢出存储,允许你处理比你的 RAM 大得多的数据集我们可以设置以下环境变量来启用此功能:

这就是使用 Modin 加速 panda 函数的指南。呮需修改 import 语句就可以很容易地做到这一点希望你发现 Modin 至少在一些情况下对加速 panda有用。

星标我每天多一点智慧

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

我要回帖

更多关于 love 的文章

 

随机推荐