python3中的字典类型用了哈希排列,速度很快。到底有多快呢。

最近写数据分析代码,有一个筛选程序,在使用pandas.apply的过程中,在apply过程中使用了loc函数,速度很慢。为了提高速度,尝试用python的基础字典类型来改进。结果速度提高了60多倍。下面介绍过程。

任务是这样:

有一个目标数据集Dataframe——df1。形状为(100000,2),包括GridPower实时功率、风速两列数据:数据集

有一组筛选条件s1,名称为MeanPower(平均功率),索引为风速,长度为3701:筛选条件

我们的搜索目标:筛选出同一风速下,实时功率小于平均功率的数据。

解决问题的思路:

1. 在数据集df1中增加一列MeanPower,填充该风速下的平均功率。

2. 比较MeanPower列与GridPower的大小,得到结果。(略)

难题在第一步,如何根据风速和s1之间的关系填充df1呢?

我在这里用到了pandas的apply函数。

方法一,使用apply函数,并在apply中使用s1.loc来获取风速对应的平均功率:

df2 = df1

df2['MeanPower'] = df1['WindSpeed_str'].apply(lambda x: s1.loc[x])

df2方法一筛选后的结果

方法二,使用apply函数,将s1转化为python字典dict1,并在apply中使用dict1.get来获取风速对应的平均功率:

df2 = df1

dict1 = s1.to_dict()

df2['MeanPower'] = df1['WindSpeed_str'].apply(lambda x: dict1.get(x))

df2方法二筛选后的结果

很明显,两种方法得到的结果是一样的。

但是两者的计算速度呢?我们用%timeit看一下:

%timeit df2.loc[:,'MeanPower'] = df1['WindSpeed_str'].apply(lambda x: s1.loc[x])

df2使用pandas自带的loc,程序运行时间为1.55 s ± 47.5 ms

使用python字典,程序运行时间为19.8 ms ± 745 µs

可以看到,使用pandas自带的loc,程序运行时间为1.55 s ± 47.5 ms。而使用python字典,程序运行时间为19.8 ms ± 745 µs。78倍!

二者相差78倍,当数据量更大时,差距会变得更大。

所以在使用apply函数的时候,可以优先考虑python字典的方式做筛选器,而不是用pandas自带的loc。

这里并不是说loc不好,而是用python字典更适合。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐