是否需要使用NumPy代替Pandas处理数据以提高性能?
Pandas和NumPy是Python数据科学领域中最基础的两个库,他们都可以读取大量的数据并对数据做计算等处理。有很多的操作他们都能做。只不过一般来说,Pandas的DataFrame是一种“表格”,处理的数据可以是非常复杂的结构,一个DataFrame对象可以包括数值、字符等内容。而NumPy处理的基本对象一般是数值型的数组。

那么,这两个Python库在数据处理的性能上有什么差别呢?在工程项目中,是否需要考虑优先选择哪种?今天在Reddit上看到一个有意思的讨论和大家分享一下。
一、问题的由来
有位网友是做ETL工具的,目前他们使用pandas来处理数据。他们目前会在亚马逊云上的EC2做一笑部分的Python脚本工作。不过,目前项目中的数据都是比较小的数据。但是有的人建议他如果想更有效率地处理更大规模的数据,最好使用numpy代替pandas。他就问,是不是numpy替代pandas会更好?有没有必要?这个问题引起了很多的争论,各有观点,我选择了一些比较有价值的讨论供大家参考。
二、具体的讨论
-
某些pandas的方法非常“笨拙”,只要避免使用也是可以的。这种情况下不需要用NumPy替换。比如iterrows按行循环Pandas的DataFrame数据,这是非常慢的。可以考虑使用lambda或者tolist代替。而像apply这种方法表现不稳定,不同方法性能差异较大,谨慎使用。其它操作性能基本都是差不多,不需要替换。
-
有个以前搞MATLAB的童鞋,现在转成用Python,所以他的处理最常见的就是向量操作。他觉得观点1非常正确。只是有一种情况,有一些多个dataframe组成的dict操作性能一般,无法解决(这哥们还顺带diss了一下MATLAB,说除非是simulink不得已,否则肯定不会再回去使用MATLAB)。不过,这个观点有人不赞同,说使用多索引的DataFrame和dict保存多个DataFrame处理是很复杂的语法,但是性能提升一般。实际中可以考虑使用Pandas on Spark。就用最基本的存储对象操作,性能几乎没有影响。
-
第三种观点是当某些处理已经由处理引擎优化的时候(如SQL、Spark甚至是GPU的并行计算)那就不需要多考虑了,但是如果是一些操作没有现成的优化引擎,最好的方式是使用native C重写。
-
慎用DataFrame的迭代与apply方法,多采用lambda、frequent encapsulation代替。
