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

  • 时间:
  • 浏览:17
  • 来源:快三网上投注平台

让朋友 在数据帧上做就让 计算量大的操作看下。将有几个数据帧连接起来是 Pandas 中的另三个 多多常用操作——朋友 的数据可能蕴藏在有几个可能更多的 CSV 文件中,朋友 不得不一次读入另三个 多多文件,再进行数据帧连接。朋友 在 Pandas 和 Modin 中只需调用 pd.concat() 函数就还需用很容易做到这点。

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

多核系统何如加速处里数据。左图:单核处里最好的法子,10 个任务都由单个计算节点处里。右图:双核处里最好的法子,每个节点处里 5 个任务,于是处里传输速率就加倍了。

点个在看少个 bug

以上代码中,朋友 将另三个 多多数据帧好友克隆了 5 次进行连接。Pandas 还需用在 3.56 秒内完成这些 连接操作,而 Modin 只花了 0.041 秒,Modin 实现了 86.83 倍的加速!看起来即使朋友 没办法 6 个 CPU 核,数据帧的分块对加速也起了很大的作用。

Pandas 是 Python 中处里数据的首选库,它使用起来很容易,非常灵活,才能处里不同类型和大小的数据,就让它有几瓶的函数,这让操作数据简直是小菜一碟。

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

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

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

上图是另三个 多多简单示例。Modin 实际上采用了另三个 多多分块管理器,它还需用基于操作类型来改变分块大小和形状。同类,有个操作需用删改的行可能列。在这些 请况下,分块管理器)会以它能发现的最优最好的法子执行切分,并把分块分散发送到 CPU 核上,它是很灵活的。

给 Modin 性能做基准测试

说到这里,理论次要可能介绍得足够多啦。让朋友 来看看代码和性能的基准测试吧!

在前面一节中,朋友 提到了 Pandas 只用另三个 多多 CPU 核做数据处里的最好的法子。很自然,这成了另三个 多多大大的瓶颈,很重是对于较大的数据帧,缺少计算资源会给性能带来较大影响。

作者丨George Seif

我就看了,就让 操作,Modin 明显更快,通常是读取数据和查找数据。就让 操作,比如进行统计计算,Pandas 会快要是。

Modin 是何如用 Pandas 做并行处里的

结论

让朋友 来看下 Modin 就有何如运行的,就让看有几个代码用例。

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

为了测试传输速率,我导入了 time 这些 模块,在 read_csv() 函数前后调用了 time.time()。结果,Pandas 花了 8.38 秒从 CSV 文件中载入数据到内存,而 Modin 仅花了 3.22 秒,Modin 实现了 2.6 倍的加速。假如有一天修改导入库名称就还需用实现原本的加速,并非 太爽了!

当处里大数据时,通常请况下,数据集的大小不必超出系统内存(RAM)的大小。就让,Modin 还有另三个 多多很重的标记,通过把这些 标记设置为 true,朋友 还需用启动核外(out of core)模式。核外模式是指当内存欠缺用时,Modin 会使用硬盘空间,原本就使我就处里比内存大小更大的数据集。朋友 设置如下的环境变量来开启这些 功能:

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

预警以及最后的基准测试

Pandas 中总是使用的数据帧清理函数是.fillna() 函数。这些 函数搜索数据帧中值为 NaN 的元素,将其值替换为你指定的值,这其蕴藏几瓶的操作。Pandas 不得不遍历每一行每一列来找到 NaN 值就让替换它们。这里使用 Modin 来操作就再适合不过了,可能朋友 这里是对另三个 多多简单操作重复要是次。

对 Modin 的操作建议

策划丨蔡芳芳

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

就让,大多数用于数据科学的现代化机器都大约 有 2 个 CPU 核,这导致 ,在有 2 个 CPU 核的机器上,使用 Pandas 的默认配置时,大约 有 30% 的计算机算力都被闲置了。可能你有 4 个核(现代的 Intel i5)可能 6 个核(现代的 Intel i7),请况那就更糟糕了,可能 Pandas 就就有为有效利用多核算力而设计的。

就让 Modin 总是没办法 快吗?

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

想象一下这些 例子,你有另三个 多多数据帧,它有要是列,却没办法 寥寥几行。就让 库只会在行这些 维度做切分,在这些 例子中并行度就欠缺了,可能朋友 的列数大于行数。就让有了 Modin,可能它会在另三个 多多维度进行切分,要是不管数据帧是宽的(列数较多)还是长条形的(行数较多),可能两类请况兼具时,其对有有哪些数据帧的并行处里就都很高效了。

理论上讲,并行计与否很容易的,只需用把数据集不同次要的计算应用到每个可用的 CPU 核上。对于 Pandas 的数据帧,基本的想法要是把这些 数据帧分成好有几个,块数和你机器上的 CPU 核数量相等,让每另三个 多多 CPU 核计算其中一块。最后,朋友 再把计算结果汇总,这些 汇总操作计算量并非 大。

嗯,人太好并非 总是没办法 快。

朋友 要做的第另三个 多多测试要是简单地用 read_csv() 函数读取数据。使用 Pandas 可能 Modin 实现这些 功能的代码是删改一样的。

就让 请况下,Pandas 实际上会比 Modin 运行得更快,即使在这些 有着 5,992,097(几乎 300 万)行的大数据集上。下面表格展示了 Pandas 和 Modin 在就让 实验上的运行时间。

译者丨夏夜

朋友 预期 Modin 对同类操作可能运行得很好,可能它才能处里几瓶的数据。代码如下所示:

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

Pandas 默认是在单个 CPU 核上,采用单线程池池执行函数,这在小数据集上运行得很好,可能你可能觉察没办法 没办法 来越多性能上的差异。就让,对于较大数据集,需用做更多的计算,这时可能还只使用单个 CPU 核,就会结束了了感觉到性能受到影响了。对于具有百万行甚至数十亿行的数据集,Pandas 每次只计算另三个 多多数。

好了,你可能掌握了 Modin 模块!这是一篇 Modin 加速 Pandas 函数的使用指南。只需用修改 import 导入得话即可实现加速。希望大约 在就让 请况下,我就发现 Modin 对加速 Pandas 函数有所帮助。

默认请况下,Modin 会使用你的机器上所有可用的 CPU 核。可能就让 请况下,你希望限制 Modin 使用的 CPU 核数量,很重是当你还想在别的地方使用有有哪些核的算力的就让。朋友 还需用通过 Ray 模块中的初始化设置来限制 Modin 能使用的 CPU 核数量,可能 Modin 会在后台使用 Ray 配置。

在 Pandas 中生成了另三个 多多数据帧后,朋友 的目标是用最快的最好的法子执行就让 计算可能处里工作,比何如能是要求解每列的平均数(使用 mean() 函数)、根据groupby字段对数据分组、移除所有重复数据(使用 drop_duplicates() 函数),可能是 Pandas 中就让 内建的函数。

这正是 Modin 所采用的最好的法子,它把数据帧切割成不同次要,每个次要就有被送到不同的 CPU 核。Modin 会同时从行和列另三个 多多维度对数据帧切分。这使得 Modin 的并行处里还需用适应任何形状的数据帧。

为了在执行并行处里时完成几瓶繁重的工作,Modin 还需用使用 Dask 可能 Ray 。这另三个 多多库就有用 Python API 写的并行计算库,我就在运行时选取其一与 Modin 同时使用。Ray 是目前为止最安全的,可能它更加稳定——而 Dask 后端还是实验性质的。

Modin 还是另三个 多多非常新的库,开发和扩展就有不断进行中。要是,就有所有的 Pandas 函数都得到了删改加速。可能你使用了 Modin 中还没办法 加速的函数,它会默认使用 Pandas 函数版本,要是原本就不必产生任何 bug 可能错误。想查看 Modin 中支持的 Pandas 函数加速的删改列表,请浏览该页面。