pandas - 矢量化代码慢于循环

时间:2016-07-16 20:08:25

标签: python pandas

我有两个函数可以得到相同的结果,一个是矢量化的,一个是" for"环。令人惊讶的是,for循环比矢量化版本更快。知道为什么会这样吗?

def loop_for(df):
    gpd    = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP'])
    result = []
    for (quarter, unite), data in gpd:
        nb_MAT_RH   = data["MAT_RH"  ].nunique()
        nb_MAT_RHPI = data["MAT_RHPI"].nunique()
        result.append({"CD_PDP": unite, "MOIS_COMPTABLE": quarter, "nb_mat_rh" : nb_MAT_RH, "nb_MAT_RHPI" : nb_MAT_RHPI})

    return pd.DataFrame(result)


def vectorisation(df):
    b = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP']).apply(lambda x: pd.Series( {"nb_mat_rh"   : x["MAT_RH"  ].nunique(),
                                                                                          "nb_MAT_RHPI" : x["MAT_RHPI"].nunique()}))
    return b.reset_index()

测试时:

import timeit
print "loop"
print timeit.timeit(stmt="loop_for(df)",number= 2, setup="from __main__ import loop_for; from __main__ import df")
print "vector"
print timeit.timeit(stmt="vectorisation(df)",number= 2, setup="from __main__ import vectorisation; from __main__ import df")

它给出了:

loop
6.83789801598
vector
7.13991713524

1 个答案:

答案 0 :(得分:1)

url对象执行.nunique()确实利用了矢量化:

SeriesGroupBy

但即使没有原始grouped = df.groupby([pd.TimeGrouper(freq="QS-JAN"), 'CD_PDP']) b = df.groupby('a').agg({'MAT_RH': 'nunique', 'MAT_RHPI': 'nunique'}) b = b.rename(columns={'MAT_RH': 'nb_mat_rh', 'MAT_RHPI': 'nb_MAT_RHPI'}) 的样本,也无法运行任何基准测试。