שאלה על יעילות ו"יופי"

היי. נניח שנדרש ממני לקחת רשימה של str, להמיר אותה לרשימה של int ולהחזיר סכום.
עולות לי 2 אופציות לעשות את זה ואני תוהה על ההבדלים ביניהם:

  1. map\ list comprehension שיפוך את כולם לint ואז להכניס לפונקציה sum
  2. לבנות פונקציה שתעבור על כל המשתנים ברשימה, ואת כל אחד מהם תהפוך לint ואז תוסיף למשתנה שיצבור את הסכום.
    שתי האפשרויות בעקרון עושות את אותן הפעולות, אבל האופציה הראשונה תעבור על הרשימה פעמיים והשניה אחת. האם יש איזשהו הבדל ביצועי בין האפשרויות והאם אחת מהן תיחשב “יפה יותר”?
לייק 1

-דרך יפה לעשות את זה:
קרא על הפונקציה: reduce, שנמצאת ב-functools.
היא עושה את מה שרצית ב-3 מילים (+עוד כמה פסיקים וסוגריים).

*ואם אתה כבר בשוונג - עבור על התיעודים functools, ושל intertools - אולי תמצא שם עוד כמה דברים חמודים, שיכולים להפוך את הקוד שלך לנעים בעין!

**על הדרך - זרוק רענון על lambda, והצץ גם בספריה - ‘Operator’ - כי הם יכולים להפוך את השימוש ב-functools וב-intertools לאפילו שווה יותר.


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

***נ.ב. אפילו כתבנו פעם (באחד מהשבועות הראשונים!) - כלי שעושה את זה!

בהצלחה!

לייק 1

השתמשתי בעבר בfunctools ובאמת שחכתי מהאופציה הזאת. זה מקצר לי בכמה שורות את הכתיבה של פונקציה חדשה לאופציה 2, ולגמרי פותר את שאלת היופי.
לגבי בדיקה של תזמונים, האם להריץ בדיקה אחת עם מספר גדול של משתנים תיתן תשובה מספקת האם פתרון אחד טוב יותר מהשני? איך כדאי לגשת לבדיקה כזאת?

לייק 1

א. אש! :muscle:


ב. ככל שתריץ את הבדיקה יותר פעמים - תקבל תמונה יותר מדויקת.

אז אם אתה בא סתם ב-“איזי”, כתוב לך “בסבבה בצד” פונקציית בדיקה, ואז תריץ אותה בלולאה כמה וכמה פעמים.

אבל אם בא לך להגדיל ראש, אז למה שלא תכתוב לעצמך כלי לשימוש עתידי?

למשל: פונקציית בדיקה שכבר אוטומטית בודקת 1,000 פעמים, ומחזירה ממוצע.

*אבל רגע אחד - מה יקרה אם תרצה להשתמש בה כדי לבדוק, נגיד, את תרגיל מלחמה ושלום? 1,000 פעמים יכול לקחת נצח! אם ככה - למה לא לכתוב פונקציה: כללית יותר, שמקבלת כפרמטרים פונקציה לבדיקה, וכמה פעמים לבצע את הבדיקה, והיא תחזיר ממוצע של משך הבדיקות?

**רוצה לקחת את זה לנקסט לבל? - אותו הדבר, רק שברירת המחדל היא לבדוק פעם אחת, אבל המשתמש יכול להזין מספר פעמים אופציונלי. (ואז היא תבדוק את מספר הפעמים הזה).

***נקסט לבל של זה? - אם המשתמש לא הזין מספר בדיקות - תן לו תשובה. אם הוא כן הזין - תג’נרט לו תשובה מתעדכנת, וככה הוא גם יהיה יכול לעצור את הבדיקה באמצע (למקרה שהיא לוקחת יותר מדי זמן).

**** שלב הבא: שהפונקציה גם תחזיר כמה בדיקות נעשו. (ואז המשתמש ידע: “מה, עצרתי רק אחרי 10? לא מספיק מדוייק לי - אני רוצה לנסות שוב”). על הדרך - שתספר למשתמש גם כמה זמן ארכה המגה-בדיקה כולה.

*****החאה: תכתוב פונקציית השוואה, שעובדת כמו הקודמת, רק שהפעם המשתמש מזין שתי פונקציות, ומקבל תשובה על שתיהן. (ואולי אפילו גם עם הערה מי “נצחה”, או שתחזיר תשובה מסודרת מהפונקציה הכי יעילה - לפונקציה הכי פחות יעילה).

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

*******עכשיו תקח את כל מה שעשית, ותכניס אותו למודול משלך בשם ArgovTools, ובכל פעם שאתה ממציא לעצמך פונקציה מגניבה שעושה דברים שימושיים (זוכר את כל התרגילים שבהם היינו צריכים לנקות טקסט? :wink:) - תוסיף אותה לשם. אולי אפילו עם הזמן תארגן לך אותן במחלקות שונות, ובסוף הקורס תצא עם ספרייה שלמה, של האקים לשימוש עצמי (או אפילו: ציבורי!), שאגרת לעצמך. :slight_smile:

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

8 לייקים

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

רק בריאות (:smile: :

אהבתי את החשיבה ואת התפתחות השלבים!
WOW

לייק 1