正文:
如果你使用过Python及Pandas,那么你很有可能已经使用了for循环去进行某些数据分析操作。不幸的是,绝大部分Python新手使用的下标循环语句实际上是非常之慢的,即便在小数据集上也会消耗大量的运行时间。本专栏之前的一些文章已经涉及了这方面的讨论,在这篇文章中文兄进一步特意对五种不同的For Loop方法进行横向对比,使大家更加明晰自己平时写的各种For循环到底效率几何。注意:之后代码里出现的df是一个只有一个column叫做test的dataframe。另外各方法下面的代码均只是用法举例,并不和测试速度用的代码完全一致。

方法1:下标循环(速度等级: )




for循环 python 时间 python for循环效率_向量化


下标循环是通过循环一个下标数列,通过iloc去不断get数据,这个方法是新手最常用的但也是最慢的,在测试例子中大概需要21.9s。方法2:Iterrows循环 (速度等级: )


for循环 python 时间 python for循环效率_Python_02


该循环方式是通过iterrows进行循环,ind和row分别代表了每一行的index和内容。测试例子大概需要0.07s,比起下标循环速度提升了321倍。方法3:Apply循环(速度等级: )


for循环 python 时间 python for循环效率_Python_03


Apply是pandas的一个常用函数,通常的用法是内接一个lambda匿名函数,从而对dataframe的每一行都进行循环处理。在测试例子中,apply的速度为0.027s,比下标循环快了811倍。方法4:Pandas内置向量化函数(速度等级: )


for循环 python 时间 python for循环效率_向量化_04


Pandas为我们提供了大量的内置向量化函数,比如sum,mean就可以快速计算某一列的求和和平均。在测试例子中速度为0.00236s,比下标循环快了9280倍。方法5:Numpy向量化函数(速度等级: )


for循环 python 时间 python for循环效率_向量化_05


最后一种方法是将Pandas的数据转化为Numpy的Array,然后使用Numpy的内置函数进行向量化操作。在测试例子中速度为0.000305s,比下标循环快了71800倍。
下面是详细的速度对比图,来自之前链接:


for循环 python 时间 python for循环效率_Python_06


Sources:
[1] https://stackoverflow.com/questions/52673285/performance-of-pandas-apply-vs-np-vectorize-to-create-new-column-from-existing-c
[2] https://en.wikipedia.org/wiki/Locality_of_reference