תכנות Python הוא נח ביסודו. מושגים כמו ניהול זיכרון, Stack overflow, או ניהול מערכים דינמיים יכולים להיות זרים למתכנתי Python.
זה לא אומר בהכרח שהם צריכים להיות לא מודעים לגמרי לעניין.
בפוסט זה ננסה להתחמק ממספר מוקשים הכוללים נוחות שימוש ב-Python שבשוטף אנחנו משתמשים בהם אבל כדי לכתוב אלגוריתם יעיל, במיוחד כאשר מדובר בסדרי נתונים מאסיביים, כדאי להמנע מהם.
כולם יודעים שב-Python אין Arrays אלא Lists, אבל רק חלק יודעים שזה לא בהכרח. ניתן להשתמש ב-Arrays ע"י שימוש ב-Import.
List תופס יותר זיכרון מאשר Array, מכיון שהוא דינאמי יותר. ניתן לאחסן בו type שונים של ערכים וניתן לשנות את הגודל שלו ע"י שימוש ב-append או ב-remove מה שלא אפשרי ב-Array סטנדרטי.
בנוסף, השימוש ב-append לוקח זמן מכיון שברקע נוצר Array בזיכרון, אליו מועתקים כל הערכים מה-Array הקודם. אין באמת אפשרות להרחיב Array. בגדלים קטנים, זה לא משמעותי אך ככל שה-Array גדל, זמן ההוספה גדל.
לחלופין, במקום להשתמש ב-Array, ניתן להשתמש ב-List אך ליצור אותו עם גודל התחלתי מספיק גדול ורק לשנות את הערכים שלו בלי לשנות את הגודל שלו ע"י append, remove וכדו' .
כדאי לזכור שבדיקה האם ערך קיים בתוך Set היא סיבוכיות זמן של 1 ולא של n כמו במערך.
לכן, אם אתם צריכים לבדוק שוב ושוב אם ערך קיים במבנה נתונים כלשהו, עדיף להשתמש ב-Set מאשר ב-List.
שימוש בפונקציות המחזירות List הוא נח, אבל במקרה ונדרש צורך לקרוא שוב ושוב לאותה פונקציה, כדאי לכתוב אותה בצורת Generator המחזיר בכל פעם ערך יחיד במקום List שלם.
רלוונטי עבור משתמשי Python 2. שימוש ב-xrange לעומת range, הוא בדומה לשימוש בפונקציה המחזירה List לעומת Generator המחזיר ערך אחד בכל פעם.
כאשר משתמשים ב-Range, כל המערך נוצר בזיכרון ועל גביו מתבצעת האיטרציה. לעומת זאת ב- xrange מוחזר בכל פעם הערך האחרון בכל קריאה. פחות מקום בזיכרון ופחות זמן ריצה.
השתמשו במשתנים בחכמה. העדיפו תמיד משתמשים מקומיים על פני גלובלים - הגישה אליהם יותר מהירה.
בנוסף, בכל מקום בו אתם מבצעים חישוב בפונקציה יותר מפעם אחת - אחסנו את הערך במשתנה מקומי במקום לבצע את החישוב שוב.
רלוונטי עבור משתמשי Python 2. אם אתם כותבים לולאה הכוללת While תמידי, עדיף שתשתמשו ב- While 1. הסיבות נעוצות במבנה מיושן של Python שמתייחס ל- True כאילו True הוא משתנה.
אם אתם צריכים לייצר פלט של ערכים בלולאה, ברוב המקרים כדאי שתשמשו ב- List Comprehension. מעבר לעובדה שאתם מוסיפים Readability לקוד, הביצועים בהשוואה ללולאה רגילה, יהיו טובים יותר.
לסיום, אם אתם מתלבטים בין שני מימושים של אותו קוד, כדאי לדעת שניתן למדוד את זמן הריצה שלו בשניות, ע"י שימוש ב- timeit.
זה לא אומר בהכרח שהם צריכים להיות לא מודעים לגמרי לעניין.
בפוסט זה ננסה להתחמק ממספר מוקשים הכוללים נוחות שימוש ב-Python שבשוטף אנחנו משתמשים בהם אבל כדי לכתוב אלגוריתם יעיל, במיוחד כאשר מדובר בסדרי נתונים מאסיביים, כדאי להמנע מהם.
List
List תופס יותר זיכרון מאשר Array, מכיון שהוא דינאמי יותר. ניתן לאחסן בו type שונים של ערכים וניתן לשנות את הגודל שלו ע"י שימוש ב-append או ב-remove מה שלא אפשרי ב-Array סטנדרטי.
בנוסף, השימוש ב-append לוקח זמן מכיון שברקע נוצר Array בזיכרון, אליו מועתקים כל הערכים מה-Array הקודם. אין באמת אפשרות להרחיב Array. בגדלים קטנים, זה לא משמעותי אך ככל שה-Array גדל, זמן ההוספה גדל.
לחלופין, במקום להשתמש ב-Array, ניתן להשתמש ב-List אך ליצור אותו עם גודל התחלתי מספיק גדול ורק לשנות את הערכים שלו בלי לשנות את הגודל שלו ע"י append, remove וכדו' .
Set
לכן, אם אתם צריכים לבדוק שוב ושוב אם ערך קיים במבנה נתונים כלשהו, עדיף להשתמש ב-Set מאשר ב-List.
Generators
Xrange
כאשר משתמשים ב-Range, כל המערך נוצר בזיכרון ועל גביו מתבצעת האיטרציה. לעומת זאת ב- xrange מוחזר בכל פעם הערך האחרון בכל קריאה. פחות מקום בזיכרון ופחות זמן ריצה.
Variables
בנוסף, בכל מקום בו אתם מבצעים חישוב בפונקציה יותר מפעם אחת - אחסנו את הערך במשתנה מקומי במקום לבצע את החישוב שוב.
While True
רלוונטי עבור משתמשי Python 2. אם אתם כותבים לולאה הכוללת While תמידי, עדיף שתשתמשו ב- While 1. הסיבות נעוצות במבנה מיושן של Python שמתייחס ל- True כאילו True הוא משתנה.
אין תגובות:
הוסף רשומת תגובה