אל תשתמש ב-iterrows של Pandas. זה מה שאתה יכול לעשות במקום…
משתמשים בפונקציה iterrows של Pandas כדי להריץ לולאה על רשומות במסד הנתונים. הבעיה היא שהפונקציה איטית. במדריך זה נסקור 2 חלופות. אחת מהם מאיצה את הביצועים פי-100.
כדי להדגים את הבעיה הורדתי את מסד הנתונים למחשב שלי.
התחלתי מייבוא של 1,000 השורות הראשונות:
# data source: https://archive.ics.uci.edu/ml/datasets/adult
columns = [0, 1]
df = pd.read_csv('data/census.csv', usecols=columns, nrows=1000)
df.columns = ['id','workclass']
העמודה השנייה היא workclass, והיא מכילה מספר קטגוריות שמיות. אני מעוניין למצות את השמות הייחודיים של הקטגוריות. נעשה את זה באמצעות iterrows של Pandas:
start = time.time()
job_types = []
for i, r in df.iterrows():
workclass = r["workclass"]
if workclass not in job_types:
job_types.append(r["workclass"])
end = time.time()
print(end - start)
- משך הריצה: 0.043 שניות
אפשר לקצר את משך הריצה על ידי הפיכת הנתונים למילון של פייתון באמצעות הפונקציה to_dict:
start = time.time()
dict_df = df.to_dict("records")
job_types = []
for r in dict_df:
workclass = r["workclass"]
if workclass not in job_types:
job_types.append(r["workclass"])
end = time.time()
print(end - start)
- משך הריצה: 0.09 שניות. מהיר כמעט פי-5.
אבל למה בכלל להשתמש בלולאה, הפונקציות של Pandas מיועדות לתת את הביצועים הטובים ביותר. במקרה שלנו, הפונקציה unique של Pandas יכולה לעשות את העבודה:
start = time.time()
df["workclass"].unique()
end = time.time()
print(end - start)
- משך הריצה: 0.01 שניות. מהיר פי-43 מ-iterrows.
- בנוסף התחביר קומפקטי והקוד ברור.
ניסיתי עם פי-10 יותר רשומות (10,000), והתוצאות אפילו יותר מרשימות:
|
שיטה |
משך הזמן בשניות |
|---|---|
|
iterrows |
0.33 |
|
שימוש במילון |
0.03 |
|
פונקציה של Pandas |
0.003 |
- שימוש במילון מהיר פי-10 מאשר iterrows, והפונקציה של Pandas מהירה פי-100.
לסיכום, מילונים עדיפים על מסדי נתונים כשרוצים לבצע פעולה על כל אחת מהרשומות. כשאפשר, כדאי להשתמש בפונקציות של Pandas, ולוותר על הלולאות.
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים