2014-04-16 64 views
0

我想弄清楚为什么这两种方法在%timeit结果中有所不同。熊猫:函数之间的时间差和适用于系列

import pandas as pd 
import numpy as np 
d = pd.DataFrame(data={'S1' : [2,3,4,5,6,7,2], 'S2' : [4,5,2,3,4,6,8]}, \ 
       index=[1,2,3,4,5,6,7]) 

%timeit pd.rolling_mean(d, window=3, center=True) 
10000 loops, best of 3: 182 µs per loop 

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True)) 
1000 loops, best of 3: 695 µs per loop 

为什么应用(lambda)方法〜3.5 x慢。在更复杂的数据框中,我注意到了更大的差异(〜10 x)。

lambda方法是否在此操作中创建数据的副本?

回答

1

看起来像极本例中的性能差异可以用raw=True选项被淘汰:

%timeit pd.rolling_mean(d, window=3, center=True) 
1000 loops, best of 3: 281 µs per loop 

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True)) 
1000 loops, best of 3: 1.02 ms per loop 

现在添加Raw=True选项:

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3, center=True),raw=True) 
1000 loops, best of 3: 289 µs per loop 

添加reduce=False让你一个小速度 - 因为熊猫不必猜测回报:

%timeit d.apply(lambda x: pd.rolling_mean(x, window=3,center=True),raw=True,reduce=False) 
1000 loops, best of 3: 285 µs per loop 

因此,在这种情况下,看起来大多数性能差异是相关的,即将每列转换为Series,并将每个系列单独传递给rolling_mean。它使用Raw=True它只是通过ndarrays。

+0

感谢 - http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.apply.html – sanguineturtle