כיצד להשתמש ב- timeit לפרופיל קוד פייתון

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

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

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

דוגמא פשוטה לפייתון

הנה דוגמה פשוטה לאופן timeitהעבודה:

def f1 (): עבור n בטווח (100): לעבור def f2 (): n = 0 בעוד n <100: n + = 1 אם __name__ == "__main__": זמן ייבוא ​​להדפסה (timeit.timeit (f1, number = 100000)) הדפס (timeit.timeit (f2, מספר = 100000)) 

תוכנית זו משווה את הביצועים של שתי דרכים לחזור באמצעות לולאה 100 פעמים: באמצעות range הפונקציה המובנית של Python  ( f1), ועל ידי הגדלת משתנה ( f2). timeit מריץ כל אחת מהגישות הללו 100,000 פעמים, ומספק זמן ריצה כולל בסוף לכל אחת מהן. כברירת מחדל,  timeit משתמש במיליון ריצות, אך דוגמה זו מראה כיצד ניתן להגדיר את מספר הריצות לכל נתון שנראה מתאים.

התוצאות (ממעבד Intel i7-3770K):

0.1252315

0.45453989999999994

ברור  range שהגישה מהירה הרבה יותר, לפי גורם של כ -3.75. זה לא מפתיע; שימוש ב- Python מובנה בדרך כלל מניב ביצועים טובים יותר מאשר מניפולציה ידנית של אובייקטים של Python.

השתמש ב- Python timeit על ידי העברת מחרוזת

דרך נוספת לשימוש  timeit היא להעביר מחרוזת המוערכת כתוכנית פייתון:

יבוא זמן זה

הדפס (timeit.timeit ('עבור n בטווח (100): לעבור'))

ניתן לעשות זאת גם משורת הפקודה:

python -m timeit "עבור n בטווח (100): לעבור"

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

טיפים לפיתון timeit

שימושי ככל  timeit שיהיה, זכור אזהרות אלה לגבי אופן השימוש בו.

הימנע משימוש ב- timeit לפרופיל כל התוכנית

שום דבר לא אומר שאי  אפשר  לתזמן איתו תוכנית שלמה  timeit. סקריפט פשוט בן 10 שורות, למשל, אינו מועמד רע להיות מנוסח כך.

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

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

בצע מספר פעולות זמן במכונות שונות

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

לבסוף, זה גם עוזר להריץ את אותה הבדיקה במערכות שונות: איך משהו קשור בדיסק יתנהג בכונן SSD לעומת כונן קשיח מסתובב קונבנציונאלי? כמו בכל שאלה אחרת לגבי ביצועים - אל תנחש, בדוק.