Pandas Getting Performance

http://pandas.pydata.org/pandas-docs/version/0.24/user_guide/enhancingperf.html?highlight=performance

For intensive ndarray computing (loops): - use cython with numpy - use numba with numpy

在引入更复杂的基础设施(如k8s、多进程)等方式之前,先使用算法、语言级别的性能优化。而在执行优化之前,先应该找到瓶颈。既可以使用小代码片段和模拟数据来验证代码(或算法)的性能,或小规模数据使用profile来看,也可以往代码中加入时间开销打印输出等方式来寻找(尤其是在函数体内)。

比如,我在做MCS的统计分析时,一开始猜测是df的loop开销大,花了力气优化。但后来按步骤,先加入时间开销打印语句,找出来时间开销是在df.loc[i,j]=的设置语句上。后来改进了算法,将大量的df.loc[i,j]变成了df.join,充分利用了df join内部的批量优化。

df loop循环内的操作时间很短,但由于循环次数很多,累计时间也非常长。这时就要找到哪些语句花了最多的时间,进行优化。在我的这个例子中,这样做实际上效果不好。

我是先把df loop改成 numpy 数组上基于 cython memoryview的计算,然后将费时的赋值操作集中在一起,又改造成了df join内的批量操作。df join内的批量操作,实际上也是利用了cython和numpy对数组操作的优化。如果放在原有的普通的loop里面,这种优化是无法实现的。因此,性能优化也不能简单的按部就班,有时候就是需要综合考虑算法是否发挥了技术的长处、避免了技术的短处。如果当前的实现(算法)处于技术弱项上,就需要重构、改写,发挥长处。

另一点,python的扩展,python官方也不推荐直接基于其 C/API去开发普通的扩展,这样太底层。C/API是面向中间工具开发者的。而开发普通的python扩展模块,应该基于中间工具,如cython、cffi、numba等。目前来看,cython的方案是最强大,社区是最活跃的。cython既可以像写python那样,写python得c;又可以集成c代码、c库,强大而灵活。