מבוא
מאחסון מספרים שלמים פשוטים ועד לניהול זרימות עבודה מורכבות, מבני נתונים מניחים את הבסיס ליישומים חזקים. ביניהם, ה תור לעתים קרובות מתגלה כמסקרן ונמצא בכל מקום. תחשוב על זה - א קו בבנק, המתנה לתורך ליד דלפק מזון מהיר, או משימות חציצה במערכת מחשב - כל התרחישים האלה מהדהדים עם המכניקה של תור.
האדם הראשון בתור מקבל שירות ראשון, ומגיעים חדשים מצטרפים בסוף. זוהי דוגמה מהחיים האמיתיים של תור בפעולה!
עבור מפתחים, במיוחד ב-Python, תורים הם לא רק מבנים תיאורטיים מתוך ספר לימוד במדעי המחשב. הם מהווים את הארכיטקטורה הבסיסית ביישומים רבים. מניהול משימות במדפסת ועד הבטחת זרימת נתונים בצורה חלקה בשידורים חיים, לתורים יש תפקיד הכרחי.
במדריך זה, נעמיק במושג התורים, נחקור את המאפיינים שלהם, יישומים בעולם האמיתי, והכי חשוב, כיצד ליישם אותם ולהשתמש בהם ביעילות ב-Python.
מהו מבנה נתוני תור?
בניווט בנוף של מבני נתונים, אנו נתקלים לעתים קרובות במכולות שיש להם כללים ברורים להזנת נתונים ואחזורם. בין אלה, ה תור בולט באלגנטיות והישירות שלו.
עקרון ה-FIFO
בבסיסו, תור הוא מבנה נתונים ליניארי שדבק ב- ראשון נכנס ראשון החוצה (FIFO) עִקָרוֹן. המשמעות היא שהאלמנט הראשון שנוסף לתור יהיה הראשון שיוסר. כדי להשוות את זה לתרחיש שאפשר להתייחס אליו: שקול שורה של לקוחות בדלפק כרטיסים. האדם שמגיע ראשון מקבל את הכרטיס ראשון, וכל הגעות הבאות עומדות בתור בסוף, ומחכות לתורן.
הערה: לתור יש שני קצוות - מאחור ומלפנים. החזית מציינת מהיכן יוסרו אלמנטים, והחלק האחורי מציין היכן יתווספו אלמנטים חדשים.
פעולות תור בסיסיות
-
תור - המעשה של מוסיף אלמנט עד הסוף (אחורי) של התור.
-
דקו - המעשה של הסרת אלמנט מה חזית של התור.
-
הצצה או חזית - במצבים רבים, זה מועיל פשוט לצפות באלמנט הקדמי מבלי להסיר אותו. הפעולה הזו מאפשרת לנו לעשות בדיוק את זה.
-
IsEmpty – פעולה שעוזרת לקבוע אם התור מכיל אלמנטים כלשהם. זה יכול להיות חיוני בתרחישים שבהם פעולות מותנות בכך שהתור מכיל נתונים.
הערה: בעוד שלחלק מהתורים יש גודל מוגבל (תורים מוגבלים), אחרים יכולים לגדול כל עוד זיכרון המערכת מאפשר זאת (תורים לא מוגבלים).
הפשטות של התורים וכללי הפעולה הברורים שלהם הופכים אותם לאידיאליים עבור מגוון יישומים בפיתוח תוכנה, במיוחד בתרחישים הדורשים עיבוד מסודר ושיטתי.
עם זאת, הבנת התיאוריה היא רק הצעד הראשון. ככל שנתקדם, נעמיק בהיבטים המעשיים, ונמחיש כיצד ליישם תורים ב-Python.
כיצד ליישם תורים ב-Python - רשימות מול Deque vs. Queue Module
Python, עם ספריית סטנדרטים עשירה ותחביר ידידותי למשתמש, מספקת מספר מנגנונים ליישום ועבודה עם תורים. בעוד שכולם משרתים את המטרה הבסיסית של ניהול תורים, הם מגיעים עם הניואנסים, היתרונות והמלכודות הפוטנציאליות שלהם. בואו ננתח כל גישה, ונמחיש את המכניקה שלה ואת מקרי השימוש הטובים ביותר.
הערה: בדוק תמיד את מצב התור שלך לפני ביצוע פעולות. לדוגמה, לפני יציאה מהתור, ודא אם התור ריק כדי למנוע שגיאות. כמו כן, עבור תורים מוגבלים, ודא שיש מקום לפני עמידה בתור.
שימוש ברשימות Python ליישום תורים
השימוש ברשימות המובנות של Python ליישום תורים הוא אינטואיטיבי ופשוט. אין צורך בספריות חיצוניות או במבני נתונים מורכבים. עם זאת, ייתכן שגישה זו לא תהיה יעילה עבור מערכי נתונים גדולים. הסרת רכיב מתחילת רשימה (pop(0)
) לוקח זמן ליניארי, מה שעלול לגרום לבעיות ביצועים.
הערה: עבור יישומים הדורשים ביצועים גבוהים או כאלו העוסקים בנפח משמעותי של נתונים, עבור אל collections.deque
למורכבות זמן מתמדת עבור עמידה בתור ויציאה בתור.
נתחיל ביצירת רשימה שתייצג את התור שלנו:
queue = []
התהליך של הוספת אלמנטים לסוף התור (תור) אינו אלא הוספתם לרשימה:
queue.append('A')
queue.append('B')
queue.append('C')
print(queue)
כמו כן, הסרת האלמנט מחזית התור (יציאה מהתור) שווה ערך להסרה בלבד של האלמנט הראשון ברשימה:
queue.pop(0)
print(queue)
שימוש collection.deque ליישם תורים
גישה זו היא יעילה ביותר כמו deque
מיושם באמצעות רשימה מקושרת כפולה. הוא תומך בהוספה מהירה של O(1) וקופץ משני הקצוות. החיסרון של גישה זו הוא שכן מעט פחות אינטואיטיבי למתחילים.
קודם כל, נייבא את deque
חפץ מה collections
מודול ואתחול התור שלנו:
from collections import deque queue = deque()
כעת, אנו יכולים להשתמש ב- append()
שיטה לתור אלמנטים ואת popleft()
שיטה ליציאה מהתור של אלמנטים מהתור:
עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!
queue.append('A')
queue.append('B')
queue.append('C')
print(queue) queue.popleft()
print(queue)
שימוש בפייתון תור מודול ליישום תורים
השמיים queue
מודול בספרייה הסטנדרטית של Python מספק גישה מיוחדת יותר לניהול תורים, המספקת מקרי שימוש שונים:
- SimpleQueue – תור FIFO בסיסי
- LifoQueue - תור LIFO, בעצם מחסנית
- PriorityQueue – אלמנטים מוציאים בתור על סמך העדיפות שהוקצתה להם
הערה: בחר ב queue
מודול, אשר נועד להיות חוט בטוח. זה מבטיח שפעולות במקביל על התור לא יובילו לתוצאות בלתי צפויות.
גישה זו נהדרת מכיוון שהיא נועדה במפורש לפעולות בתור. אבל, למען האמת, זה עשוי להיות מוגזם עבור תרחישים פשוטים.
עכשיו, בואו נתחיל להשתמש ב- queue
מודול על ידי ייבואו לפרויקט שלנו:
import queue
מכיוון שאנו מיישמים תור FIFO פשוט, אנו אתחול אותו באמצעות ה- SimpleQueue()
בַּנַאִי:
q = queue.SimpleQueue()
פעולות תור ותור מיושמות באמצעות put()
ו get()
שיטות מה- queue
מודול:
q.put('A')
q.put('B')
q.put('C')
print(q.queue) q.get()
print(q.queue)
הערה: פעולות בתור עלולות להעלות חריגים שאם לא יטופלו, עלולים לשבש את זרימת היישום שלך. כדי למנוע זאת, עטוף את פעולות התור שלך try-except
בלוקים.
למשל, לטפל ב queue.Empty
חריג כאשר עובדים עם queue
מודול:
import queue q = queue.SimpleQueue() try: item = q.get_nowait()
except queue.Empty: print("Queue is empty!")
באיזה יישום לבחור?
הבחירה שלך בהטמעת תור ב- Python צריכה להתאים לדרישות האפליקציה שלך. אם אתה מטפל בכמות גדולה של נתונים או שאתה זקוק לביצועים אופטימליים, collections.deque
היא בחירה משכנעת. עם זאת, עבור יישומים מרובי הליכי או כאשר סדרי עדיפויות נכנסים לפעולה, ה queue
מודול מציע פתרונות חזקים. עבור סקריפטים מהירים או כשאתה רק מתחיל, רשימות Python עשויות להספיק, אך תמיד היזהרו ממלכודות הביצועים הפוטנציאליות.
הערה: המצאת הגלגל מחדש על ידי יישום מותאם אישית של פעולות תור כאשר Python כבר מספקת פתרונות מובנים רבי עוצמה.
לפני יצירת פתרונות מותאמים אישית, הכירו את ההצעות המובנות של Python כמו deque
ו queue
מודול. לעתים קרובות יותר מאשר לא, הם נותנים מענה למגוון רחב של דרישות, חוסכים זמן ומצמצמים שגיאות פוטנציאליות.
צלול עמוק יותר: מושגי תור מתקדמים ב-Python
למי שתפס את המכניקה הבסיסית של תורים ולהוט להעמיק יותר, Python מציעה שפע של מושגים וטכניקות מתקדמות כדי לחדד ולייעל פעולות מבוססות תורים. בואו נחשוף כמה מההיבטים המתוחכמים הללו, ונעניק לכם ארסנל של כלים להתמודדות עם תרחישים מורכבים יותר.
תורים כפולים עם דק
בעוד שחקרנו בעבר deque
בתור FIFO, הוא תומך גם בפעולות LIFO (Last-In-First-Out). זה מאפשר לך להוסיף או להקפיץ אלמנטים משני הקצוות עם מורכבות O(1):
from collections import deque dq = deque()
dq.appendleft('A') dq.append('B') dq.pop() dq.popleft()
PriorityQueu בפעולה
שימוש בתור FIFO פשוט כאשר סדר העיבוד תלוי בעדיפות יכול להוביל לחוסר יעילות או לתוצאות לא רצויות, לכן, אם הבקשה שלך דורשת שרכיבים מסוימים יעובדו לפני אחרים בהתבסס על קריטריונים מסוימים, השתמש ב- PriorityQueue
. זה מבטיח שאלמנטים מעובדים על סמך סדרי העדיפויות שנקבעו.
תסתכל כיצד אנו קובעים סדרי עדיפויות עבור האלמנטים שאנו מוסיפים לתור. זה דורש שנעביר tuple כטיעון של put()
שיטה. ה-tuple צריך להכיל את העדיפות כאלמנט הראשון שלו ואת הערך בפועל כאלמנט השני:
import queue pq = queue.PriorityQueue()
pq.put((2, "Task B"))
pq.put((1, "Task A")) pq.put((3, "Task C")) while not pq.empty(): _, task = pq.get() print(f"Processing: {task}")
זה ייתן לנו את הדברים הבאים:
Processing: Task A
Processing: Task B
Processing: Task C
שימו לב כיצד הוספנו אלמנטים בסדר שונה ממה שמאוחסן בתור. זה בגלל סדרי העדיפויות שהקצינו ב put()
שיטה בעת הוספת אלמנטים לתור העדיפות.
יישום תור מעגלי
תור מעגלי (או מאגר טבעת) הוא מבנה נתונים מתקדם שבו האלמנט האחרון מחובר לראשון, מה שמבטיח זרימה מעגלית. deque
יכול לחקות התנהגות זו באמצעות שלה maxlen
נכס:
from collections import deque circular_queue = deque(maxlen=3)
circular_queue.append(1)
circular_queue.append(2)
circular_queue.append(3) circular_queue.append(4)
print(circular_queue)
סיכום
תורים, בסיסיים אך חזקים, מוצאים את המהות שלהם במגוון יישומים ובעיות חישוביות בעולם האמיתי. מתזמון משימות במערכות הפעלה ועד לניהול זרימת נתונים ב-printspoolers או בקשות שרת אינטרנט, ההשלכות של תורים הן מרחיקות לכת.
Python מביאה לשולחן פלטה עשירה של כלים וספריות לעבודה עם תורים. מהתורים הפשוטים המבוססים על רשימות לתסריטים מהירים ועד לתורים היעילים ביותר deque
עבור יישומים קריטיים לביצועים, השפה באמת עונה על קשת של צרכים.
- הפצת תוכן ויחסי ציבור מופעל על ידי SEO. קבל הגברה היום.
- PlatoData.Network Vertical Generative Ai. העצים את עצמך. גישה כאן.
- PlatoAiStream. Web3 Intelligence. הידע מוגבר. גישה כאן.
- PlatoESG. פחמן, קלינטק, אנרגיה, סביבה, שמש, ניהול פסולת. גישה כאן.
- PlatoHealth. מודיעין ביוטכנולוגיה וניסויים קליניים. גישה כאן.
- מקור: https://stackabuse.com/guide-to-queues-in-python/
- :יש ל
- :הוא
- :לֹא
- :איפה
- $ למעלה
- 1
- 11
- 13
- 17
- 20
- 7
- 8
- 9
- a
- אודות
- בנוגע לזה
- לפעול
- פעולות
- ממשי
- למעשה
- הוסיף
- מוסיף
- מתקדם
- יתרונות
- קדימה
- ערני
- ליישר
- תעשיות
- מאפשר
- כְּבָר
- גם
- תמיד
- בין
- an
- ו
- כל
- בקשה
- יישומים
- גישה
- ארכיטקטורה
- ARE
- טענה
- מגיע
- ארסנל
- AS
- היבטים
- שהוקצה
- At
- לְהִמָנַע
- מבוסס
- בסיסי
- BE
- כי
- לפני
- למתחילים
- ההתחלה
- התנהגות
- מועיל
- הטוב ביותר
- אבני
- גבול
- שניהם
- מביא
- חיץ
- מובנה
- אבל
- by
- CAN
- מקרים
- לספק
- מספקת
- לגרום
- מסוים
- מאפיינים
- לבדוק
- בחירה
- בחרו
- ברור
- אוספים
- איך
- משכנע
- מורכב
- מורכבות
- חישובית
- המחשב
- מדעי מחשב
- מושג
- מושגים
- מסקנה
- במקביל
- מחובר
- לשקול
- קבוע
- להכיל
- מכולות
- ליבה
- דלפק
- יוצרים
- הקריטריונים
- מכריע
- מנהג
- לקוחות
- נתונים
- הזנת נתונים
- מבנה נתונים
- מערכי נתונים
- התמודדות
- עמוק
- עמוק יותר
- להתעמק
- תובעני
- תלוי
- מעוצב
- לקבוע
- מפתחים
- צעצועי התפתחות
- אחר
- לשבש
- מובהק
- do
- downside
- כל אחד
- לָהוּט
- יעילות
- יעיל
- אלמנט
- אלמנטים
- מתגלה
- סוף
- מסתיים
- לְהַבטִיחַ
- מבטיח
- הבטחתי
- כניסה
- שווה
- שגיאות
- במיוחד
- מַהוּת
- למעשה
- דוגמה
- יוצא מן הכלל
- בִּמְפוּרָשׁ
- חקר
- היכרות
- חיצוני
- להכיר
- מרחיק לכת
- מהר
- ראשון
- תזרים
- להתמקד
- הבא
- בעד
- טופס
- החל מ-
- חזית
- לגמרי
- יסודי
- Git
- לתת
- נתינה
- גדול
- עבודות קרקע
- לגדול
- מדריך
- לטפל
- טיפול
- ידות על
- יש
- יש
- עוזר
- גָבוֹהַ
- מאוד
- יָשָׁר
- לרחף
- איך
- איך
- אולם
- HTTPS
- ICON
- אידאל
- if
- איור
- ליישם
- הפעלה
- יושם
- יישום
- השלכות
- לייבא
- חשוב
- יבוא
- in
- כלול
- מצביע על
- חוסר יעילות
- למשל
- אל תוך
- מסקרן
- מבוא
- אינטואיטיבי
- בעיות
- IT
- שֶׁלָה
- להצטרף
- רק
- נוף
- שפה
- גָדוֹל
- אחרון
- שכב
- עוֹפֶרֶת
- למידה
- פחות
- לתת
- LG
- ספריות
- סִפְרִיָה
- כמו
- מוגבל
- קו
- רשימה
- רשימות
- לחיות
- ll
- ארוך
- נראה
- לעשות
- ניהול
- ניהול
- רב
- אומר
- מכניקה
- מנגנוני
- זכרון
- שיטה
- שיטות
- יכול
- מודול
- יותר
- רוב
- המהלך
- צורך
- צרכי
- חדש
- לא
- שום דבר
- ניואנסים
- אובייקט
- להתבונן
- of
- הצעות
- המיוחדות שלנו
- לעתים קרובות
- on
- ONE
- פועל
- מערכות הפעלה
- מבצע
- תפעול
- מטב
- אופטימיזציה
- or
- להזמין
- אחר
- אחרים
- שלנו
- הַחוּצָה
- תוצאות
- לוח הצבע
- לעבור
- ביצועים
- ביצוע
- אדם
- אפלטון
- מודיעין אפלטון
- אפלטון נתונים
- לְשַׂחֵק
- שֶׁפַע
- פופ
- פופס
- פוטנציאל
- פוטנציאל
- חזק
- מעשי
- למנוע
- קוֹדֶם
- עקרון
- קופונים להדפסה
- עדיפות
- בעיות
- תהליך
- מעובד
- תהליך
- פּרוֹיֶקט
- רכוש
- מספק
- מטרה
- פיתון
- מָהִיר
- להעלות
- רכס
- RE
- עולם אמיתי
- הפחתה
- לחדד
- הוסר
- הסרת
- לייצג
- בקשות
- לדרוש
- דרישות
- דורש
- להדהד
- עשיר
- טַבַּעַת
- חָסוֹן
- תפקיד
- כללי
- s
- חסכת
- תרחיש
- תרחישים
- תזמון
- מדע
- סקריפטים
- בצורה חלקה
- שְׁנִיָה
- לשרת
- שירת
- שרת
- סט
- כמה
- Shadow
- גיליון
- צריך
- משמעותי
- מסמל
- פָּשׁוּט
- פשטות
- מצבים
- מידה
- So
- תוכנה
- פיתוח תוכנה
- פתרונות
- כמה
- מתוחכם
- מֶרחָב
- מיוחד
- ספֵּקטרוּם
- Stackabuse
- תֶקֶן
- תקנים
- עומד
- התחלה
- החל
- מצב
- שלב
- עצור
- מאוחסן
- אחסון
- פשוט
- זרמים
- מִבְנֶה
- מבנים
- לאחר מכן
- תומך
- SVG
- מתג
- תחביר
- מערכת
- מערכות
- שולחן
- לְהִתְמוֹדֵד
- לוקח
- המשימות
- משימות
- טכניקות
- ספר לימוד
- מֵאֲשֶׁר
- זֶה
- השמיים
- הנוף
- שֶׁלָהֶם
- אותם
- תיאורטי
- התאוריה
- שם.
- אלה
- הֵם
- לחשוב
- זֶה
- אלה
- דרך
- כרטיס
- זמן
- ל
- כלים
- מַעֲבָר
- נָכוֹן
- באמת
- תור
- שתיים
- נמצא בכל מקום
- לגלות
- בְּסִיסִי
- הבנה
- בלתי צפוי
- us
- להשתמש
- ידידותי למשתמש
- באמצעות
- ערך
- מגוון
- שונים
- Ve
- לאמת
- כֶּרֶך
- vs
- הַמתָנָה
- we
- אינטרנט
- שרת אינטרנט
- מה
- מה
- גַלגַל
- מתי
- אשר
- בזמן
- מי
- רָחָב
- טווח רחב
- יצטרך
- עם
- לְלֹא
- תיק עבודות
- זרימות עבודה
- עובד
- לעטוף
- עוד
- אתה
- עצמך
- זפירנט