13 במאי 2017

Performance issue in Python

תכנות Python הוא נח ביסודו. מושגים כמו ניהול זיכרון, Stack overflow, או ניהול מערכים דינמיים יכולים להיות זרים למתכנתי Python.
זה לא אומר בהכרח שהם צריכים להיות לא מודעים לגמרי לעניין.

בפוסט זה ננסה להתחמק ממספר מוקשים הכוללים נוחות שימוש ב-Python שבשוטף אנחנו משתמשים בהם אבל כדי לכתוב אלגוריתם יעיל, במיוחד כאשר מדובר בסדרי נתונים מאסיביים, כדאי להמנע מהם.


List


כולם יודעים שב-Python אין Arrays אלא Lists, אבל רק חלק יודעים שזה לא בהכרח. ניתן להשתמש ב-Arrays ע"י שימוש ב-Import.

List תופס יותר זיכרון מאשר Array, מכיון שהוא דינאמי יותר. ניתן לאחסן בו type שונים של ערכים וניתן לשנות את הגודל שלו ע"י שימוש ב-append או ב-remove מה שלא אפשרי ב-Array סטנדרטי.

בנוסף, השימוש ב-append לוקח זמן מכיון שברקע נוצר Array בזיכרון, אליו מועתקים כל הערכים מה-Array הקודם. אין באמת אפשרות להרחיב Array. בגדלים קטנים, זה לא משמעותי אך ככל שה-Array גדל, זמן ההוספה גדל.

לחלופין, במקום להשתמש ב-Array, ניתן להשתמש ב-List אך ליצור אותו עם גודל התחלתי מספיק גדול ורק לשנות את הערכים שלו בלי לשנות את הגודל שלו ע"י append, remove וכדו' .


Set


כדאי לזכור שבדיקה האם ערך קיים בתוך Set היא סיבוכיות זמן של 1 ולא של n כמו במערך.
לכן, אם אתם צריכים לבדוק שוב ושוב אם ערך קיים במבנה נתונים כלשהו, עדיף להשתמש ב-Set מאשר ב-List.


Generators


שימוש בפונקציות המחזירות List הוא נח, אבל במקרה ונדרש צורך לקרוא שוב ושוב לאותה פונקציה, כדאי לכתוב אותה בצורת Generator המחזיר בכל פעם ערך יחיד במקום List שלם.


Xrange


רלוונטי עבור משתמשי Python 2. שימוש ב-xrange לעומת range, הוא בדומה לשימוש בפונקציה המחזירה List לעומת Generator המחזיר ערך אחד בכל פעם.

כאשר משתמשים ב-Range, כל המערך נוצר בזיכרון ועל גביו מתבצעת האיטרציה. לעומת זאת ב- xrange מוחזר בכל פעם הערך האחרון בכל קריאה. פחות מקום בזיכרון ופחות זמן ריצה.


Variables


השתמשו במשתנים בחכמה. העדיפו תמיד משתמשים מקומיים על פני גלובלים - הגישה אליהם יותר מהירה.
בנוסף, בכל מקום בו אתם מבצעים חישוב בפונקציה יותר מפעם אחת - אחסנו את הערך במשתנה מקומי במקום לבצע את החישוב שוב.


While True


רלוונטי עבור משתמשי Python 2. אם אתם כותבים לולאה הכוללת While תמידי, עדיף שתשתמשו ב- While 1. הסיבות נעוצות במבנה מיושן של Python שמתייחס ל- True כאילו True הוא משתנה.


List Comprehension


אם אתם צריכים לייצר פלט של ערכים בלולאה, ברוב המקרים כדאי שתשמשו ב- List Comprehension. מעבר לעובדה שאתם מוסיפים Readability לקוד, הביצועים בהשוואה ללולאה רגילה, יהיו טובים יותר.


TimeIt


לסיום, אם אתם מתלבטים בין שני מימושים של אותו קוד, כדאי לדעת שניתן למדוד את זמן הריצה שלו בשניות, ע"י שימוש ב- timeit.




אין תגובות:

הוסף רשומת תגובה