方法1:在我的机器上还不错(已numexpr
禁用)
In [41]: from pandas.core import expressions as expr
In [42]: expr.set_use_numexpr(False)
In [43]: %timeit df1+df2+df3+df4
1 loops, best of 3: 349 ms per loop
方法2:使用numexpr
(如果numexpr
已安装,默认情况下启用)
In [44]: expr.set_use_numexpr(True)
In [45]: %timeit df1+df2+df3+df4
10 loops, best of 3: 173 ms per loop
方法3:直接使用 numexpr
In [34]: import numexpr as ne
In [46]: %timeit DataFrame(ne.evaluate('df1+df2+df3+df4'),columns=df1.columns,index=df1.index,dtype='float32')
10 loops, best of 3: 47.7 ms per loop
这些加速是通过以下方式实现的numexpr
:
正如我在上面暗示的那样,pandasnumexpr
在某些特定类型的操作(例如0.11)下在后台使用,例如df1 + df2
将以这种方式进行评估,但是您在此处给出的示例将导致多次调用numexpr
(方法2比方法1快) )。使用直接方法(方法3)ne.evaluate(...)
可以实现更大的加速。
请注意,在熊猫0.13(本周将发布0.12)中,我们实现了一个函数pd.eval
,该函数实际上将执行上述示例中的操作。敬请期待(如果您喜欢冒险,它将很快成为大师:https ://github.com/pydata/pandas/pull/4037)
In [5]: %timeit pd.eval('df1+df2+df3+df4')
10 loops, best of 3: 50.9 ms per loop
最后回答您的问题,cython
将完全没有帮助;numexpr
在这类问题上非常有效(也就是说,在 某些 情况下,cython很有帮助)
一个警告:为了使用直接的Numexpr方法,帧应该已经对齐(Numexpr在numpy数组上运行,并且对索引一无所知)。而且它们应该是单个dtype