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

  • 时间:
  • 浏览:16
  • 来源:3分快三-官网

点个在看少个 bug

好了,你之前 掌握了 Modin 模块!这是一篇 Modin 加速 Pandas 函数的使用指南。只需要修改 import 导入语句即可实现加速。希望大慨在某些情况表下,让我发现 Modin 对加速 Pandas 函数有所帮助。

译者丨夏夜

让大伙儿儿在数据帧上做某些计算量大的操作看下。将有十几个 数据帧连接起来是 Pandas 中的另一3个多常用操作——大伙儿儿的数据之前 含晒 在有十几个 之前 更多的 CSV 文件中,大伙儿儿不得不一次读入另一3个多文件,再进行数据帧连接。大伙儿儿在 Pandas 和 Modin 中只需调用 pd.concat() 函数就都需要很容易做到这点。

Pandas 是 Python 中解决数据的首选库,它使用起来很容易,非常灵活,后能 解决不这名型和大小的数据,之前 它有几瓶的函数,这让操作数据青春恋爱物语是小菜一碟。

为了测试效率,我导入了 time 这名模块,在 read_csv() 函数前后调用了 time.time()。结果,Pandas 花了 8.38 秒从 CSV 文件中载入数据到内存,而 Modin 仅花了 3.22 秒,Modin 实现了 2.6 倍的加速。之前 修改导入库名称就都需要实现原来的加速,暂且太爽了!

大伙儿儿预期 Modin 对这名操作之前 运行得很好,之前 它后能 解决几瓶的数据。代码如下所示:

Pandas 着实 是 Python 中用于数据解决的库,但它都是 为高性能数据解决而打造的。本文将带你了解最近新推出的代码库 Modin,它是专为 Pandas 分布式计算而开发的,后能 加速解决数据。

Modin 是何如用 Pandas 做并行解决的

想象一下这名例子,你另一3个多多数据帧,它有统统列,却不到寥寥几行。某些库只会在行这名维度做切分,在这名例子中并行度就不足了,之前 大伙儿儿的列数大于行数。之前 有了 Modin,之前 它会在另一3个多维度进行切分,统统不管数据帧是宽的(列数较多)还是长条形的(行数较多),之前 两类情况表兼具时,其对哪有十几个 数据帧的并行解决就都很高效了。

给 Modin 性能做基准测试

默认情况表下,Modin 会使用你的机器上所有可用的 CPU 核。之前 某些情况表下,你希望限制 Modin 使用的 CPU 核数量,不何如是当你还想在别的地方使用哪有十几个 核的算力的之前 。大伙儿儿都需要通过 Ray 模块中的初始化设置来限制 Modin 能使用的 CPU 核数量,之前 Modin 会在后台使用 Ray 配置。

策划丨蔡芳芳

让大伙儿儿来看下 Modin 都是 何如运行的,之前 看有十几个 代码用例。

对 Modin 的操作建议

多核系统何如加速解决数据。左图:单核解决措施,10 个任务都由单个计算节点解决。右图:双核解决措施,每个节点解决 5 个任务,于是解决效率就加倍了。

上图是另一3个多简单示例。Modin 实际上采用了另一3个多分块管理器,它都需要基于操作类型来改变分块大小和形态。这名,有个操作需要完全的行之前 列。在这名情况表下,分块管理器)会以它能发现的最优措施执行切分,并把分块分散发送到 CPU 核上,它是很灵活的。

结论

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

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

之前 Modin 老要什么什么都如此 快吗?

在前面一节中,大伙儿儿提到了 Pandas 只用另一3个多 CPU 核做数据解决的措施。很自然,这成了另一3个多大大的瓶颈,不何如是对于较大的数据帧,缺少计算资源会给性能带来较大影响。

Pandas 中老要使用的数据帧清理函数是.fillna() 函数。这名函数搜索数据帧中值为 NaN 的元素,将其值替换为你指定的值,这其含晒 几瓶的操作。Pandas 不得不遍历每一行每一列来找到 NaN 值之前 替换它们。这里使用 Modin 来操作就再适合不过了,之前 大伙儿儿这里是对另一3个多简单操作重复统统次。

嗯,着实 暂且老要什么什么都如此 快。

当解决大数据时,通常情况表下,数据集的大小不需要超出系统内存(RAM)的大小。之前 ,Modin 还另一3个多多不何如的标记,通过把这名标记设置为 true,大伙儿儿都需要启动核外(out of core)模式。核外模式是指当内存不足用时,Modin 会使用硬盘空间,原来就使让我解决比内存大小更大的数据集。大伙儿儿设置如下的环境变量来开启这名功能:

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

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

在 Pandas 中生成了另一3个多数据帧后,大伙儿儿的目标是用最快的措施执行某些计算之前 解决工作,比如之前 是要求解每列的平均数(使用 mean() 函数)、根据groupby字段对数据分组、移除所有重复数据(使用 drop_duplicates() 函数),之前 是 Pandas 中某些内建的函数。

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

理论上讲,并行计算不算很容易的,只需要把数据集不同偏离 的计算应用到每个可用的 CPU 核上。对于 Pandas 的数据帧,基本的想法统统把这名数据帧分成好有十几个 ,块数和你机器上的 CPU 核数量相等,让每另一3个多 CPU 核计算其中一块。最后,大伙儿儿再把计算结果汇总,这名汇总操作计算量暂且大。

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

Modin 还是另一3个多非常新的库,开发和扩展都是 不断进行中。统统,都是 所有的 Pandas 函数都得到了完全加速。之前 你使用了 Modin 中还什么什么都如此 加速的函数,它会默认使用 Pandas 函数版本,统统原来就不需要产生任何 bug 之前 错误。想查看 Modin 中支持的 Pandas 函数加速的完全列表,请浏览该页面。

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

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

之前 ,大多数用于数据科学的现代化机器都是花费有 2 个 CPU 核,这原因,在有 2 个 CPU 核的机器上,使用 Pandas 的默认配置时,大慨有 30% 的计算机算力都被闲置了。之前 你有 4 个核(现代的 Intel i5)之前 6 个核(现代的 Intel i7),情况表那就更糟糕了,之前 Pandas 就都是 为有效利用多核算力而设计的。

大伙儿儿要做的第另一3个多测试统统简单地用 read_csv() 函数读取数据。使用 Pandas 之前 Modin 实现这名功能的代码是完全一样的。

说到这里,理论偏离 之前 介绍得足够多啦。让大伙儿儿来看看代码和性能的基准测试吧!

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

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

为了在执行并行解决时完成几瓶繁重的工作,Modin 都需要使用 Dask 之前 Ray 。这另一3个多库都是 用 Python API 写的并行计算库,让我在运行时选着其一与 Modin 一起去使用。Ray 是目前为止最安全的,之前 它更加稳定——而 Dask 后端还是实验性质的。

预警以及最后的基准测试

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

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

这正是 Modin 所采用的措施,它把数据帧切割成不同偏离 ,每个偏离 都是被送到不同的 CPU 核。Modin 会一起去从行和列另一3个多维度对数据帧切分。这使得 Modin 的并行解决都需要适应任何形态的数据帧。

作者丨George Seif