אל תשתמש ב-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 כוכבים

 

 

הוסף תגובה חדשה

 

= 3 + 7