繁体   English   中英

熊猫:功能和应用于系列之间的时间差异

[英]Pandas: Timing difference between Function and Apply to Series

我试图弄清楚为什么这两种方法的%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

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

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

看起来可以使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM