我有两个函数可以得到相同的结果,一个是矢量化的,一个是" 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
答案 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'})
的样本,也无法运行任何基准测试。