如何只用一行代码让 Pandas 加速四倍?

  • 时间:
  • 浏览:3

这次,Pandas 运行.fillna() 用了 1.8 秒,而 Modin 仅用了 0.21 秒,实现了 8.57 倍的加速!

策划丨蔡芳芳

默认清况 下,Modin 会使用你的机器上所有可用的 CPU 核。将会或多或少清况 下,你希望限制 Modin 使用的 CPU 核数量,有点是当你还想在别的地方使用那此核的算力的前一天。让当我们可不能能 通过 Ray 模块中的初始化设置来限制 Modin 能使用的 CPU 核数量,将会 Modin 会在后台使用 Ray 配置。

说到这里,理论累积将会介绍得足够多啦。让让当我们来看看代码和性能的基准测试吧!

预警以及最后的基准测试

让让当我们在数据帧上做或多或少计算量大的操作看下。将几块数据帧连接起来是 Pandas 中的另3个多多常用操作——让当我们的数据将会暗含在几块将会更多的 CSV 文件中,让当我们不得不一次读入另3个多多文件,再进行数据帧连接。让当我们在 Pandas 和 Modin 中只需调用 pd.concat() 函数就可不能能 很容易做到这点。

让让当我们来看下 Modin 不会怎么能能运行的,随后 看几块代码用例。

让当我们要做的第另3个多多测试就说 简单地用 read_csv() 函数读取数据。使用 Pandas 将会 Modin 实现或多或少功能的代码是完整性一样的。

Pandas 数据帧(左图)作为整块存储,且只发送到另3个多多 CPU 核。Modin 数据帧(右图)在行和列方向上被切分成了小块,每块都可不能能 被发送到不同的 CPU 核(可发送到的核数取决于系统中最大核数)。

或多或少清况 下,Pandas 实际上会比 Modin 运行得变快,即使在或多或少有着 5,992,097(几乎 1500 万)行的大数据集上。下面表格展示了 Pandas 和 Modin 在或多或少实验上的运行时间。

这正是 Modin 所采用的办法,它把数据帧切割成不同累积,每个累积不会被送到不同的 CPU 核。Modin 会同去从行和列另3个多多维度对数据帧切分。这使得 Modin 的并行外理可不能能 适应任何社会形态的数据帧。

让当我们预期 Modin 对类似操作将会运行得很好,将会它才能外理絮状的数据。代码如下所示:

译者丨夏夜

结论

Pandas 中无缘无故使用的数据帧清理函数是.fillna() 函数。或多或少函数搜索数据帧中值为 NaN 的元素,将其值替换为你指定的值,这其暗含絮状的操作。Pandas 不得不遍历每一行每一列来找到 NaN 值随后 替换它们。这里使用 Modin 来操作就再适合不过了,将会让当我们这里是对另3个多多简单操作重复好多好多 次。

https://www.kdnuggets.com/2019/11/speed-up-pandas-4x.html

Pandas 默认是在单个 CPU 核上,采用单守护进程池池执行函数,这在小数据集上运行得很好,将会你将会觉察非要太久性能上的差异。随后 ,对于较大数据集,需用做更多的计算,这时将会还只使用单个 CPU 核,就会结束了了英文感觉到性能受到影响了。对于具有百万行甚至数十亿行的数据集,Pandas 每次只计算另3个多多数。

当外理大数据时,通常清况 下,数据集的大小不想超出系统内存(RAM)的大小。随后 ,Modin 还另3个多多多有点的标记,通过把或多或少标记设置为 true,让当我们可不能能 启动核外(out of core)模式。核外模式是指当内存不够用时,Modin 会使用硬盘空间,就说 就使让我外理比内存大小更大的数据集。让当我们设置如下的环境变量来开启或多或少功能:

安装和运行 Modin 最简单的办法是通过 pip 来进行。以下命令用来安装 Modin、Ray 以及所有相关依赖。

随后 ,大多数用于数据科学的现代化机器都在花费有 2 个 CPU 核,这原困,在有 2 个 CPU 核的机器上,使用 Pandas 的默认配置时,大概有 150% 的计算机算力都被闲置了。将会你有 4 个核(现代的 Intel i5)将会 6 个核(现代的 Intel i7),清况 那就更糟糕了,将会 Pandas 就不会为有效利用多核算力而设计的。

历年来 Python 开发包的受欢迎程度。来源:

为了测试带宽,我导入了 time 或多或少模块,在 read_csv() 函数前后调用了 time.time()。结果,Pandas 花了 8.38 秒从 CSV 文件中载入数据到内存,而 Modin 仅花了 3.22 秒,Modin 实现了 2.6 倍的加速。就说 修改导入库名称就可不能能 实现就说 的加速,不想太爽了!

Modin 是怎么能能用 Pandas 做并行外理的

Pandas 我人太好是 Python 中用于数据外理的库,但它不会为高性能数据外理而打造的。本文将带你了解最近新推出的代码库 Modin,它是专为 Pandas 分布式计算而开发的,才能加速外理数据。

让我看到,或多或少操作,Modin 明显变快,通常是读取数据和查找数据。或多或少操作,比如进行统计计算,Pandas 会快好多好多 。

本文接下来的例子和基准测试,让当我们打算使用来自 Kaggle 的 CS:GO Competitive Matchmaking Data 数据集。CSV 文件中的每一行都暗含了 CS:GO 比赛中的一轮数据。

在 Pandas 中生成了另3个多多数据帧后,让当我们的目标是用最快的办法执行或多或少计算将会外理工作,比如将会是要求解每列的平均数(使用 mean() 函数)、根据groupby字段对数据分组、移除所有重复数据(使用 drop_duplicates() 函数),将会是 Pandas 中或多或少内建的函数。

Modin 还是另3个多多非常新的库,开发和扩展不会不断进行中。好多好多 ,不会所有的 Pandas 函数都得到了完整性加速。将会你使用了 Modin 中还这么加速的函数,它会默认使用 Pandas 函数版本,好多好多 就说 就不想产生任何 bug 将会错误。想查看 Modin 中支持的 Pandas 函数加速的完整性列表,请浏览该页面。

上图是另3个多多简单示例。Modin 实际上采用了另3个多多分块管理器,它可不能能 基于操作类型来改变分块大小和社会形态。类似,有个操作需用完整性的行将会列。在或多或少清况 下,分块管理器)会以它能发现的最优办法执行切分,并把分块分散发送到 CPU 核上,它是很灵活的。

作者丨George Seif

对 Modin 的操作建议

Pandas 是 Python 中外理数据的首选库,它使用起来很容易,非常灵活,才能外理不类似型和大小的数据,随后 它有絮状的函数,这让操作数据你以为是小菜一碟。

给 Modin 性能做基准测试

为了在执行并行外理时完成絮状繁重的工作,Modin 可不能能 使用 Dask 将会 Ray 。这另3个多多库不会用 Python API 写的并行计算库,让我在运行时选泽其一与 Modin 同去使用。Ray 是目前为止最安全的,将会它更加稳定——而 Dask 后端还是实验性质的。

嗯,我我人太好不想无缘无故这么快。

以上代码中,让当我们将另3个多多数据帧克隆技术了 5 次进行连接。Pandas 可不能能 在 3.56 秒内完成或多或少连接操作,而 Modin 只花了 0.041 秒,Modin 实现了 86.83 倍的加速!看起来即使让当我们非要 6 个 CPU 核,数据帧的分块对加速也起了很大的作用。

好了,你将会掌握了 Modin 模块!这是一篇 Modin 加速 Pandas 函数的使用指南。只需用修改 import 导入句子即可实现加速。希望大概在或多或少清况 下,让我发现 Modin 对加速 Pandas 函数有所帮助。

理论上讲,并行计与否很容易的,只需用把数据集不同累积的计算应用到每个可用的 CPU 核上。对于 Pandas 的数据帧,基本的想法就说 把或多或少数据帧分成两个,块数和你机器上的 CPU 核数量相等,让每另3个多多 CPU 核计算其中一块。最后,让当我们再把计算结果汇总,或多或少汇总操作计算量不想大。

在前面一节中,让当我们提到了 Pandas 只用另3个多多 CPU 核做数据外理的办法。很自然,这成了另3个多多大大的瓶颈,有点是对于较大的数据帧,缺少计算资源会给性能带来较大影响。

想象一下或多或少例子,你另3个多多多数据帧,它有好多好多 列,却非要寥寥几行。或多或少库只会在行或多或少维度做切分,在或多或少例子中并行度就不够了,将会让当我们的列数大于行数。随后 有了 Modin,将会它会在另3个多多维度进行切分,好多好多 不管数据帧是宽的(列数较多)还是长条形的(行数较多),将会两类清况 兼具时,其对那此数据帧的并行外理就都很高效了。

多核系统怎么能能加速外理数据。左图:单核外理办法,10 个任务都由单个计算节点外理。右图:双核外理办法,每个节点外理 5 个任务,于是外理带宽就加倍了。

随后 Modin 无缘无故这么快吗?

Modin 是新出的另3个多多库,通过自动化地将计算分布到系统所有可用的 CPU 核上,来加速 Pandas。Modin 宣称,通过或多或少技术,对于任何大小的 Pandas 数据帧,它都才能获得和系统 CPU 核数几乎成正比的性能增长。

点个在看少个 bug

https://stackoverflow.blog/2017/09/14/python-growing-quickly/