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

  • 时间:
  • 浏览:61
  • 来源:幸运5分6合-首页

作者丨George Seif

想要 Modin 老要 这么快吗?

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

多核系统要怎样加速处理数据。左图:单核处理土辦法 ,10 个任务都由单个计算节点处理。右图:双核处理土辦法 ,每个节点处理 5 个任务,于是处理传输速率就加倍了。

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

理论上讲,并行计与否很容易的,只还要把数据集不同次要的计算应用到每个可用的 CPU 核上。对于 Pandas 的数据帧,基本的想法我希望把这种数据帧分成好几个,块数和你机器上的 CPU 核数量相等,让每1个 CPU 核计算其中一块。最后,让我们再把计算结果汇总,这种汇总操作计算量好的反义词大。

Modin 还是1个非常新的库,开发和扩展还要不断进行中。好多好多 ,还要所有的 Pandas 函数都得到了删改加速。肯能你使用了 Modin 中还这么加速的函数,它会默认使用 Pandas 函数版本,好多好多 我希望就不多再产生任何 bug 肯能错误。想查看 Modin 中支持的 Pandas 函数加速的删改列表,请浏览该页面。

Modin 是要怎样用 Pandas 做并行处理的

策划丨蔡芳芳

想象一下这种例子,你1个数据帧,它有好多好多 列,却必须寥寥几行。好多好多 库只会在行这种维度做切分,在这种例子中并行度就过低了,肯能让我们的列数大于行数。想要有了 Modin,肯能它会在1个维度进行切分,好多好多 不管数据帧是宽的(列数较多)还是长条形的(行数较多),肯能两类清况 兼具时,其对那此数据帧的并行处理就都很高效了。

Pandas 是 Python 中处理数据的首选库,它使用起来很容易,非常灵活,不能处理不例如型和大小的数据,想要它有极少量的函数,这让操作数据我我觉得 是小菜一碟。

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

当处理大数据时,通常清况 下,数据集的大小不多再超出系统内存(RAM)的大小。想要,Modin 还1个很重的标记,通过把这种标记设置为 true,让我们不能启动核外(out of core)模式。核外模式是指当内存过低用时,Modin 会使用硬盘空间,我希望就使让人处理比内存大小更大的数据集。让我们设置如下的环境变量来开启这种功能:

Pandas 默认是在单个 CPU 核上,采用单守护程序执行函数,这在小数据集上运行得很好,肯能你肯能觉察必须不多性能上的差异。想要,对于较大数据集,还要做更多的计算,这时肯能还只使用单个 CPU 核,就会结束了了英语 感觉到性能受到影响了。对于具有百万行甚至数十亿行的数据集,Pandas 每次只计算1个数。

译者丨夏夜

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

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

Pandas 中老要 使用的数据帧清理函数是.fillna() 函数。这种函数搜索数据帧中值为 NaN 的元素,将其值替换为你指定的值,这其蕴含极少量的操作。Pandas 不得不遍历每一行每一列来找到 NaN 值想要替换它们。这里使用 Modin 来操作就再适合不过了,肯能让我们这里是对1个简单操作重复好多好多 次。

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

在 Pandas 中生成了1个数据帧后,让我们的目标是用最快的土辦法 执行好多好多 计算肯能处理工作,比如肯能是要求解每列的平均数(使用 mean() 函数)、根据groupby字段对数据分组、移除所有重复数据(使用 drop_duplicates() 函数),肯能是 Pandas 中好多好多 内建的函数。

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

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

好了,你肯能掌握了 Modin 模块!这是一篇 Modin 加速 Pandas 函数的使用指南。只还要修改 import 导入一段话即可实现加速。希望最少在好多好多 清况 下,让人发现 Modin 对加速 Pandas 函数有所帮助。

对 Modin 的操作建议

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

这正是 Modin 所采用的土辦法 ,它把数据帧切割成不同次要,每个次要还要被送到不同的 CPU 核。Modin 会一齐从行和列1个维度对数据帧切分。这使得 Modin 的并行处理不能适应任何形态学 的数据帧。

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

让我们预期 Modin 对例如操作肯能运行得很好,肯能它不能处理极少量的数据。代码如下所示:

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

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

点个在看少个 bug

想要,大多数用于数据科学的现代化机器都最少有 2 个 CPU 核,这因为,在有 2 个 CPU 核的机器上,使用 Pandas 的默认配置时,最少有 80% 的计算机算力都被闲置了。肯能你有 4 个核(现代的 Intel i5)肯能 6 个核(现代的 Intel i7),清况 那就更糟糕了,肯能 Pandas 就还要为有效利用多核算力而设计的。

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

预警以及最后的基准测试

以上代码中,让我们将1个数据帧克隆了 5 次进行连接。Pandas 不能在 3.56 秒内完成这种连接操作,而 Modin 只花了 0.041 秒,Modin 实现了 86.83 倍的加速!看起来即使让我们必须 6 个 CPU 核,数据帧的分块对加速也起了很大的作用。

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

上图是1个简单示例。Modin 实际上采用了1个分块管理器,它不能基于操作类型来改变分块大小和形态学 。例如,有个操作还要删改的行肯能列。在这种清况 下,分块管理器)会以它能发现的最优土辦法 执行切分,并把分块分散发送到 CPU 核上,它是很灵活的。

为了测试传输速率,我导入了 time 这种模块,在 read_csv() 函数前后调用了 time.time()。结果,Pandas 花了 8.38 秒从 CSV 文件中载入数据到内存,而 Modin 仅花了 3.22 秒,Modin 实现了 2.6 倍的加速。我希望修改导入库名称就不能实现我希望的加速,好的反义词太爽了!

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

给 Modin 性能做基准测试

让我们要做的第1个测试我希望简单地用 read_csv() 函数读取数据。使用 Pandas 肯能 Modin 实现这种功能的代码是删改一样的。

嗯,我我觉得好的反义词老要 这么快。

为了在执行并行处理时完成极少量繁重的工作,Modin 不能使用 Dask 肯能 Ray 。这种个库还要用 Python API 写的并行计算库,让人在运行时选着其一与 Modin 一齐使用。Ray 是目前为止最安全的,肯能它更加稳定——而 Dask 后端还是实验性质的。

结论

让让我们来看下 Modin 还要要怎样运行的,想要看几个代码用例。