Ich habe zwei Funktionen, die das gleiche Ergebnis geben, ein Vektor und ein mit einer "for" Schleife. Überraschenderweise ist die for-Schleife schneller als die vektorisierte Version. Irgendeine Idee warum ist es so?Pandas - vektorisierter Code langsamer als für Schleife
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()
bei der Prüfung:
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")
es gibt:
loop
6.83789801598
vector
7.13991713524
Mit '.apply (Lambda ...)' ist nicht wirklich Vektorisierung; Es ist im Wesentlichen das gleiche wie eine For-Schleife über die Daten auszuführen. –
Auch haben wir keine Ahnung, was "df" Sie an Ihre Funktionen weitergeben. Aber was noch wichtiger ist ... was @ajcr gesagt hat. – piRSquared
gut zu wissen :) Könnte hier eine Vektorisierung möglich sein? Und wenn ja wie? –