iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Pandas加速代码之避免使用for循环
  • 256
分享到

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

2024-04-02 19:04:59 256人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

前言

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

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

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

数据准备

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

现在让我们建立一个标准线,用Python 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是一个静态列表,并且内存中已存在整数以便快速访问。

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

使用.apply()

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

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

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

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循环内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Pandas加速代码之避免使用for循环

本文链接: https://www.lsjlt.com/news/127162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Pandas加速代码之避免使用for循环
    前言 使用Pandas dataframe执行数千甚至数百万次计算仍然是一项挑战。你不能简单的将数据丢进去,编写Python for循环,然后希望在合理的时间内处理数据。 Panda...
    99+
    2024-04-02
  • Pandas如何避免使用for循环
    这篇文章将为大家详细讲解有关Pandas如何避免使用for循环,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言使用Pandas dataframe执行数千甚至数百万次计算仍然是一项挑战。你不能简单的将数...
    99+
    2023-06-15
  • C++开发注意事项:避免C++代码中的循环引用问题
    C++是一种广泛使用的编程语言,被广泛应用于游戏开发、嵌入式系统开发等各个领域。在C++开发过程中,有一种常见的问题被称为“循环引用”问题。循环引用指的是两个或多个类之间互相引用对方,形成一个循环的引用关系。这种情况会导致编译错误或运行时错...
    99+
    2023-11-22
    C++ 循环引用 开发注意事项
  • JavaScript如何避免在循环内部使用 try-catch-finally
    这篇文章主要为大家展示了“JavaScript如何避免在循环内部使用 try-catch-finally”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaS...
    99+
    2024-04-02
  • Java基础入门篇之如何使用For循环
    这篇文章主要讲解了“Java基础入门篇之如何使用For循环”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java基础入门篇之如何使用For循环”吧! 一、for循环语句在java中...
    99+
    2023-06-15
  • Java8特性之用Stream流代替For循环操作详解
    目录准备一个实体类准备一个List集合传统的for循环使用Stream流先声明筛选条件,在遍历Stream操作 嵌套循环(2层)准备一个实体类 public class Stud...
    99+
    2024-04-02
  • python如何使用list comprehension代替原始的for循环
    小编给大家分享一下python如何使用list comprehension代替原始的for循环,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用list comprehension代替原始的for循环假设我们想要创建一个具...
    99+
    2023-06-27
  • SqlServer GO命令循环使用实例代码
    通过GO  命令 来达到语句循环效果  也叫批循环 print '输出10次' GO 10 ...
    99+
    2024-04-02
  • WordPress使用钩子进行主题开发时如何避免死循环
    这篇文章给大家分享的是有关WordPress使用钩子进行主题开发时如何避免死循环的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。WordPress 使用钩子进行主题开发时避免死循环WordPress 开发时,我们经...
    99+
    2023-06-14
  • Git的使用规范:如何避免代码冲突?
    Git是一款广泛使用的版本控制系统,它可以帮助团队协作开发,以及管理代码的版本。但是,当多个人同时修改同一个文件时,就有可能发生代码冲突的情况。本文将介绍Git的使用规范,以及如何避免代码冲突。 1. Git分支管理 Git的分支管理功能可...
    99+
    2023-10-15
    编程算法 javascript git
  • 怎么使用Cython加速Python代码
    这篇文章主要讲解了“怎么使用Cython加速Python代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Cython加速Python代码”吧!如果您曾经用Python编写过代码,那...
    99+
    2023-06-16
  • Python 如何用一行代码实现for循环初始化数组
    我就废话不多说了,大家还是直接看代码吧~ # 用一行代码实现for循环初始化数组 o = 10 b = [ o + u for u in range( 10 ) ] print...
    99+
    2024-04-02
  • Vue 中巧用条件与循环,让代码更加优雅!
    在 Vue 应用中,条件渲染和数据循环是常见的操作。巧妙运用条件和循环可以显著提升代码的简洁性和可读性。本文将探讨 Vue 中条件与循环的各种用法,帮助开发者编写更优雅的代码。 条件渲染 v-if 和 v-else:用于根据条件显示或...
    99+
    2024-04-02
  • java之使用多线程代替for循环(解决主线程提前结束问题)
    目录CountDownLatch常用方法使用案例应用场景场景1:模拟并发场景2:多个线程完成后,进行汇总合并接下来进入正题总结在使用之前先介绍一个并发需要用到的方法: CountDo...
    99+
    2023-03-10
    java使用多线程 java for循环 java主线程
  • SqlServer GO命令循环使用实例代码怎么写
    SqlServer GO命令循环使用实例代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。通过GO 命令 来达到语句循环...
    99+
    2024-04-02
  • Vue如何使用v-for给循环标签自身属性添加属性值
    这篇文章给大家分享的是有关Vue如何使用v-for给循环标签自身属性添加属性值的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。我的代码结构如下所示不能执行,会出现报错<Rad...
    99+
    2024-04-02
  • vue中v-for和v-if一起使用之使用compute的示例代码
    目录版本目标效果说明解决方法核心代码片段Car.vue版本 vue 2.9.6element-ui: 2.15.6 目标效果 说明 在 vue 2.x 中,在一个元素上同时使用 v...
    99+
    2024-04-02
  • Spring boot 运用策略模式实现避免多次使用if的操作代码
    目录前言环境配置实现目标准备策略接口和具体实现策略类支付策略接口微信支付策略类支付宝支付策略类准备支付策略上下文Context和支付策略工厂类支付策略工厂类支付策略枚举类支付策略上下...
    99+
    2024-04-02
  • Java之map的常见用法讲解与五种循环遍历实例代码理解
    目录一、概述:二、Map集合的功能介绍三、map官方总结四、实例五、循环遍历的五种方法一、概述: 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 Map接口...
    99+
    2024-04-02
  • 如何在Linux系统上使用NumPy库来加速Python代码?
    在当今的数据科学和机器学习领域,Python已成为最受欢迎的编程语言之一。然而,Python在执行大规模数据处理和计算密集型任务时,往往速度较慢。为了解决这个问题,NumPy库被设计出来,它可以加速Python代码的执行。在本篇文章中,我们...
    99+
    2023-09-30
    numy linux leetcode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作