作者:George Seif

编译:ronghuaiyang

导读

虽然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 内核的数量得到近乎线性的加速。

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

Modin 如何用 Pandas 并行计算

给定 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 速度基准测试

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

pip install modin[ray]

对于我们下面的例子和 benchmarks,我们使用了 Kaggle 的 CS:GO Competitive Matchmaking Data。CSV 的每一行都包含了 CS:GO 比赛中的一轮数据。

现在,我们尝试使用最大的 CSV 文件(有几个),esea_master_dmg_demo .part1.csv,它有 1.2GB。有了这样的体量,我们应该能够看到 pandas 有多慢,以及 Modin 是如何帮助我们加速的。对于测试,我使用一个 i7-8700k CPU,它有 6 个物理内核和 12 个线程。

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

### Read in the data with Pandasimport pandas as pd

s = time.time()df = pd.read_csv("esea_master_dmg_demos.part1.csv")e = time.time()print("Pandas Loading Time = {}".format(e-s))

### Read in the data with Modinimport modin.pandas as pd

s = time.time()df = pd.read_csv("esea_master_dmg_demos.part1.csv")e = time.time()print("Modin Loading Time = {}".format(e-s))

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

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

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

import pandas as pddf = pd.read_csv("esea_master_dmg_demos.part1.csv")

s = time.time()df = pd.concat([df for _ in range(5)])e = time.time()print("Pandas Concat Time = {}".format(e-s))

import modin.pandas as pddf = pd.read_csv("esea_master_dmg_demos.part1.csv")

s = time.time()df = pd.concat([df for _ in range(5)])e = time.time()print("Modin Concat Time = {}".format(e-s))

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

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

import pandas as pddf = pd.read_csv("esea_master_dmg_demos.part1.csv")

s = time.time()df = df.fillna(value=0)e = time.time()print("Pandas Concat Time = {}".format(e-s))

import modin.pandas as pddf = pd.read_csv("esea_master_dmg_demos.part1.csv")

s = time.time()df = df.fillna(value=0)e = time.time()print("Modin Concat Time = {}".format(e-s))

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

警告!

Modin 总是这么快吗?

并不是这样。

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

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

Operation Pandas Time Modin Time Speedup
pd.read_csv('esea_master_dmg_demos.part1.csv') 8.38 3.22 2.6
pd.concat([df for _ in range(5)]) 3.56 0.041 86.83
df.groupby(by='wp_type') 0.00029 0.059 0.0049
df.fillna(value=0) 1.8 0.21 8.57
df.dropna() 1.24 1.71 0.73
df.count() 1.09 0.046 23.70
df.drop_duplicates() 7.68 13.38 0.57
df.describe() 1.30 4.69 0.28
df['seconds'].max() 0.015 0.26 0.058
df.isnull() 0.998 0.012 83.17

使用 Modin 的实用技巧

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

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

import rayray.init(num_cpus=4)import modin.pandas as pd

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

export MODIN_OUT_OF_CORE=true

总结

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

一行代码将Pandas加速4倍相关推荐

  1. python怎么另起一行阅读答案_一行代码将Pandas加速4倍

    作者:George Seif 编译:ronghuaiyang 导读 虽然Pandas的功能非常强大,但是对于大数据集来说,确实是很慢的. 虽然 panda 是 Python 中用于数据处理的库,但它并 ...

  2. 一行代码,Pandas秒变分布式,快速处理TB级数据

    夏乙 发自 凹非寺 量子位 出品 | 公众号 QbitAI 刚刚在Pandas上为十几KB的数据做好了测试写好了处理脚本,上百TB的同类大型数据集摆到了面前.这时候,你可能面临着一个两难的选择: 继续 ...

  3. 【Python】Modin,只需一行代码加速你的Pandas

    本文翻译自:Shrivarsheni的博客 Modin是一个Python第三方库,可以通过并行来处理大数据集.它的语法和pandas非常相似,因其出色的性能,能弥补Pandas在处理大数据上的缺陷. ...

  4. 一行代码加速 sklearn 运算上千倍

    作者 | 费弗里 来源 | Python大数据分析 ❞ 1.简介 scikit-learn作为经典的机器学习框架,从诞生至今已发展了十余年,但其运算速度一直广受用户的诟病.熟悉scikit-learn ...

  5. python pandas for循环_高逼格使用Pandas加速代码,向for循环说拜拜!

    原标题:高逼格使用Pandas加速代码,向for循环说拜拜! 作者:George Seif 编译:公众号翻译部 全网进行中··· 你为什么劝入/劝退Quant? 前言 使用Pandas datafra ...

  6. 度盘视频视频网页倍速播放?一行代码就够了

    该方法主要针对电脑网页中百度网盘视频在线播放.安卓手机推荐用"ES浏览器"+"MX播放器"实现倍数,或者下载后使用软件加速,ios端自带加速. 测试工具:Chr ...

  7. python数据可视化库 动态的_Python数据可视化:Pandas库,只要一行代码就能实现...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章一级AI入门学习 ,作者小伍哥 刚接触Python的新手.小白,可以复制下面的链接去免费观 ...

  8. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  9. 一行代码让你的python运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. "一行代码让python的运行速度提高100倍" ...

最新文章

  1. LeetCode实战:排序链表
  2. 让PHP更快的提供文件下载 【转】
  3. AJPFX关于构造器的总结
  4. Aptana Studio 3 汉化简体中文版
  5. P4180-[BJWC2010]严格次小生成树【Kruskal,倍增】
  6. AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
  7. Android开发真机测试方法 (转)
  8. python使用新线程执行目标函数
  9. 杨潮观《偷桃捉住东方朔》
  10. Python+selenium自动化 - 环境搭建
  11. 10款好用的谷歌chrome浏览器插件、扩展程序,用起来很爽哦
  12. ctf gif动图分解帧 提取flag
  13. STM8S103F3P6锁死问题及解锁
  14. cf计算机丢失msvcp100,Win7丢失MSVCP100.dll导致程序无法启动怎们办
  15. ADB 最常用命令集合及各种问题解决方式
  16. Java内存模型(JMM)详解
  17. 关于解决移动端息屏后定时器不工作的问题
  18. 生成模型和判别模型学习
  19. GMT所提供的所有命令和其功能
  20. Ubuntu实用工具/软件汇总

热门文章

  1. jquery学习(3)--高级选择器
  2. 技术图文:如何在Python中定义二维数组?
  3. 【C++】枚举类型应用
  4. 手把手快速实现 Resnet 残差模型实战
  5. 腾讯汤道生:数实融合成为行业“必答题”,腾讯未来打造四大引擎
  6. 太任性!17 岁少年买不到回国机票,因“泄愤”攻击航司系统,被判刑 4 年
  7. 遏制企业数据泄露之殇,大咖切磋云安全的攻防之道
  8. Get了!用Python制作数据预测集成工具 | 附代码
  9. “数学不行,干啥也不行!”骨灰级程序员:其实你们都是瞎努力
  10. 10万人的1000万张图像,微软悄然删除最大公开人脸数据集