Pandas加速代码之避免使用for循环


Posted in Python onMay 30, 2021

前言

使用Pandas dataframe执行数千甚至数百万次计算仍然是一项挑战。你不能简单的将数据丢进去,编写Python for循环,然后希望在合理的时间内处理数据。

Pandas是为一次性处理整个行或列的矢量化操作而设计的,循环遍历每个单元格、行或列并不是它的设计用途。所以,在使用Pandas时,你应该考虑高度可并行化的矩阵运算。

本文将教你如何使用Pandas设计使用的方式,并根据矩阵运算进行思考。在此过程中,我们将向你展示一些实用的节省时间的技巧和窍门,这些技巧和技巧将使你的Pandas代码比那些可怕的Python for循环更快地运行!

数据准备

在本文中,我们将使用经典的鸢尾花数据集。

Pandas加速代码之避免使用for循环

现在让我们建立一个标准线,用Python for循环来测量我们的速度。我们将通过循环遍历每一行来设置要在数据集上执行的计算,然后测量整个操作的速度。这将为我们提供一个基准,以了解我们的新优化对我们有多大帮助。

Pandas加速代码之避免使用for循环

在上面的代码中,我们创建了一个基本函数,它使用If-Else语句根据花瓣的长度选择花的类。我们编写了一个for循环,通过循环dataframe对每一行应用函数,然后测量循环的总时间。

在i7-8700k计算机上,循环运行5次平均需要0.01345秒。

使用.iterrows()

我们可以做的最简单但非常有价值的加速是使用Pandas的内置 .iterrows() 函数。

在上一节中编写for循环时,我们使用了 range() 函数。然而,当我们在Python中对大范围的值进行循环时,生成器往往要快得多。

Pandas的 .iterrows() 函数在内部实现了一个生成器函数,该函数将在每次迭代中生成一行Dataframe。更准确地说,.iterrows() 为DataFrame中的每一行生成(index, Series)的对(元组)。这实际上与在原始Python中使用 enumerate() 之类的东西是一样的,但运行速度要快得多!

生成器(Generators)

生成器函数允许你声明一个行为类似迭代器的函数,也就是说,它可以在for循环中使用。这大大简化了代码,并且比简单的for循环更节省内存。

考虑这样一个例子,我们想把1到1000之间的所有数字加起来。下面代码的第一部分说明了如何使用for循环来实现这一点。

如果列表很小,比如长度为1000,那就很好了。当你想要处理一个庞大的列表时,比如10亿个浮点数,问题就出现了。使用for循环,在内存中创建了大量的内存huge列表,并不是每个人都有无限的RAM来存储这样的东西!Python中的range()函数也做同样的事情,它在内存中构建列表

代码的第(2)节演示了使用Python生成器对数字列表求和。生成器将创建元素并仅在需要时将它们存储在内存中。一次一个。这意味着,如果必须创建10亿个浮点数,那么只能一次将它们存储在内存中。Python中的xrange()函数使用生成器来构建列表。

也就是说,如果你想多次迭代列表并且它足够小以适应内存,那么使用for循环和range函数会更好。这是因为每次访问list值时,生成器和xrange都会重新生成它们,而range是一个静态列表,并且内存中已存在整数以便快速访问。

Pandas加速代码之避免使用for循环

下面我们修改了代码,使用.iterrows()代替常规的for循环。在我上一节测试所用的同一台机器上,平均运行时间为0.005892秒,速度提高了2.28倍!

Pandas加速代码之避免使用for循环

使用.apply()

iterrows()函数极大地提高了速度,但我们还远远没有完成。请始终记住,当使用为向量操作设计的库时,可能有一种方法可以在完全没有for循环的情况下最高效地完成任务。

为我们提供此功能的Pandas功能是 .apply() 函数。apply()函数接受另一个函数作为输入,并沿着DataFrame的轴(行、列等)应用它。在传递函数的这种情况下,lambda通常可以方便地将所有内容打包在一起。

在下面的代码中,我们已经完全用.apply()和lambda函数替换了for循环,打包所需的计算。这段代码的平均运行时间是0.0020897秒,比原来的for循环快6.44倍。

Pandas加速代码之避免使用for循环

apply()之所以快得多,是因为它在内部尝试遍历Cython迭代器。如果你的函数针对Cython进行了优化,.apply()将使你的速度更快。额外的好处是,使用内置函数可以生成更干净、更可读的代码!

最后

前面我们提到过,如果你正在使用一个为向量化操作设计的库,你应该总是在没有for循环的情况下寻找一种方法来进行任何计算。

类似地,以这种方式设计的许多库,包括Pandas,都将具有方便的内置函数,可以执行你正在寻找的精确计算,但速度更快。

Pandas的 .cut() 函数将一组bin定义为输入,这些bin定义了If-Else的每个范围和一组标签。这与我们用 compute_class() 函数手动编写有完全相同的操作。

看下面的代码,看看.cut()是如何工作的。我们又一次得到了更干净、更可读的代码。最后,.cut()函数平均运行0.001423秒,比原来的for循环快了9.39倍!

Pandas加速代码之避免使用for循环

好了,到此这篇关于Pandas加速代码之避免使用for循环的文章就介绍到这了,更多相关Pandas for循环内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
分享一下Python数据分析常用的8款工具
Apr 29 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 Python
python中@property的作用和getter setter的解释
Dec 22 Python
Python打包为exe详细教程
May 18 Python
pandas提升计算效率的一些方法汇总
May 30 #Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
You might like
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
PHP时间相关常用函数用法示例
2020/06/03 PHP
Javascript Math对象
2009/08/13 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
[51:44]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第二场
2018/04/04 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python数据结构之单链表详解
2017/09/12 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
美国性感女装网站:bebe
2017/03/04 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
恐龙的灭绝教学反思
2014/02/12 职场文书
汉字听写大会观后感
2015/06/12 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
解决redis批量删除key值的问题
2022/03/23 Redis