• Pandas循环提速 7 万多倍是怎么实现的?
    发布日期:2019-09-11 00:49   来源:未知   阅读:

  现在,有人忍不了了。他是一位来自德国的数据分析师,名叫Benedikt Droste。

  他说,当自己花了大半个小时等待代码执行的时候,决定寻找速度更快的替代方案。

  在给出的替代方案中,使用Numpy向量化,与使用标准循环相比,速度提升了71803倍。

  DataFrame是具有行和列的Pandas对象。如果使用循环,需要遍历整个对象。

  Python不能利用任何内置函数,而且速度很慢。在Benedikt Droste的提供的示例中,是一个包含65列和1140行的Dataframe,包含了2016-2019赛季的足球赛结果。

  需要解决的问题是:创建一个新的列,用于指示某个特定的队是否打了平局。可以这样开始:

  在这个案例中是阿森纳,在实现目标之前要确认阿森纳参加了哪些场比赛,是主队还是客队。但使用标准循环非常慢,执行时间为20.7秒。

  在第一个示例中,循环遍历了整个DataFrame。iterrows为每一行返回一个Series,它以索引对的形式遍历DataFrame,以Series的形式遍历感兴趣的列。这使得它比标准循环更快:

  代码运行时间为68毫秒,比标准循环快321倍。但是,许多人建议不要使用它,因为仍然有更快的选项,而且iterrows不能跨行保存dtype。

  这意味着,如果你在DataFrame dtypes上使用iterrows,可以更改它,但这会导致很多问题。

  一定要保存dtypes的话,你还可以使用itertuples。这里我们不详细讨论 ,你可以在这里找到官方文件:

  apply 本身并不快,但与DataFrame结合使用时,它具有优势。这取决于 apply 表达式的内容。如果可以在 Cython 空间中执行,那么apply要快得多,这里的示例就是这种情况。

  大家可以在Lambda函数中使用apply。所要做的就是指定这个轴。在本文的示例中,想要执行按列操作,要使用 axis 1:

  重点是避免像之前的示例中的Python级循环,并使用优化后的C语言代码,这将更有效地使用内存。只需要稍微修改一下函数:

  在这种情况下,甚至不需要循环。所要做的就是调整函数的内容。现可以直接将Pandas 列传递给函数,从而获得巨大的速度增益。

  在上面的示例中,将将Pandas 列传递给函数。通过添加.values,可以得到一个Numpy数组:

  因为引用了局部性的好处,Numpy数组的速度非常快,代码运行时间仅为0.305毫秒,比一开始使用的标准循环快71803倍。

  他说,如果你使用Python、Pandas和Numpy进行数据分析,总会有改进代码的空间。

Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms