जेफिरनेट लोगो

पायथन में कतारों के लिए मार्गदर्शिका

दिनांक:

परिचय

सरल पूर्णांकों को संग्रहीत करने से लेकर जटिल वर्कफ़्लोज़ को प्रबंधित करने तक, डेटा संरचनाएँ मजबूत अनुप्रयोगों के लिए आधार तैयार करती हैं। उनमें से, पंक्ति अक्सर दिलचस्प और सर्वव्यापी दोनों के रूप में उभरता है। इसके बारे में सोचो - ए बैंक में लाइन, फास्ट-फूड काउंटर पर अपनी बारी का इंतजार करना, या कंप्यूटर सिस्टम में कार्यों को बफर करना - ये सभी परिदृश्य एक कतार की यांत्रिकी के साथ प्रतिध्वनित होते हैं।

पंक्ति में पहले व्यक्ति को पहले सेवा दी जाती है, और नए लोग अंत में जुड़ते हैं। यह कार्रवाई में कतार का वास्तविक जीवन का उदाहरण है!

गाइड-टू-क्यूज़-इन-पायथन-01.png

डेवलपर्स के लिए, विशेष रूप से पायथन में, कतारें केवल कंप्यूटर विज्ञान पाठ्यपुस्तक से सैद्धांतिक निर्माण नहीं हैं। वे कई अनुप्रयोगों में अंतर्निहित वास्तुकला बनाते हैं। प्रिंटर में कार्यों को प्रबंधित करने से लेकर लाइव प्रसारण में डेटा स्ट्रीम को निर्बाध रूप से सुनिश्चित करने तक, कतारें एक अपरिहार्य भूमिका निभाती हैं।

इस गाइड में, हम कतारों की अवधारणा में गहराई से उतरेंगे, उनकी विशेषताओं, वास्तविक दुनिया के अनुप्रयोगों की खोज करेंगे, और सबसे महत्वपूर्ण बात यह है कि उन्हें पायथन में प्रभावी ढंग से कैसे कार्यान्वित और उपयोग किया जाए।

कतार डेटा संरचना क्या है?

डेटा संरचनाओं के परिदृश्य के माध्यम से नेविगेट करते हुए, हम अक्सर उन कंटेनरों का सामना करते हैं जिनके पास डेटा प्रविष्टि और पुनर्प्राप्ति के लिए अलग नियम होते हैं। इनमें से पंक्ति अपनी सुंदरता और सरलता के लिए जाना जाता है।

फीफो सिद्धांत

इसके मूल में, कतार एक रैखिक डेटा संरचना है जो इसका पालन करती है फर्स्ट-इन-फर्स्ट-आउट (फीफो) सिद्धांत. इसका मतलब यह है कि कतार में जोड़ा गया पहला तत्व हटाया जाने वाला पहला तत्व होगा। इसकी तुलना एक संबंधित परिदृश्य से करने के लिए: टिकट काउंटर पर ग्राहकों की एक कतार पर विचार करें। जो व्यक्ति पहले आता है उसे अपना टिकट पहले मिलता है, और बाद में आने वाला व्यक्ति अंत में लाइन में लगकर अपनी बारी का इंतजार करता है।

नोट: एक कतार के दो सिरे होते हैं - पीछे और सामने. सामने का भाग इंगित करता है कि तत्व कहाँ से हटाए जाएंगे, और पीछे का भाग दर्शाता है कि नए तत्व कहाँ जोड़े जाएंगे।

बुनियादी कतार संचालन

  • कतारबद्ध करें - का कार्य जोड़ने अंत तक एक तत्व (पीछे) कतार का.

    गाइड-टू-क्यूज़-इन-पायथन-02.png

  • विपंक्ति - का कार्य हटाने से एक तत्व सामने कतार का.

    गाइड-टू-क्यूज़-इन-पायथन-03.png

  • झाँकना या सामने देखना - कई स्थितियों में, सामने वाले तत्व को हटाए बिना केवल उसका निरीक्षण करना फायदेमंद होता है। यह ऑपरेशन हमें बस यही करने की अनुमति देता है।

  • खाली है - एक ऑपरेशन जो यह निर्धारित करने में मदद करता है कि कतार में कोई तत्व है या नहीं। यह उन परिदृश्यों में महत्वपूर्ण हो सकता है जहां कार्रवाई डेटा वाली कतार पर निर्भर होती है।

नोट: जबकि कुछ कतारों का आकार सीमित होता है (सीमाबद्ध कतारें), अन्य संभावित रूप से तब तक बढ़ सकते हैं जब तक सिस्टम मेमोरी अनुमति देती है (अनबाउंड कतारें)।

कतारों की सरलता और संचालन के उनके स्पष्ट नियम उन्हें सॉफ्टवेयर विकास में विभिन्न प्रकार के अनुप्रयोगों के लिए आदर्श बनाते हैं, विशेष रूप से व्यवस्थित और व्यवस्थित प्रसंस्करण की मांग वाले परिदृश्यों में।

हालाँकि, सिद्धांत को समझना केवल पहला कदम है। जैसे-जैसे हम आगे बढ़ेंगे, हम व्यावहारिक पहलुओं पर गौर करेंगे और बताएंगे कि पायथन में कतारों को कैसे लागू किया जाए।

पायथन में कतारें कैसे लागू करें - सूचियाँ बनाम डेक बनाम कतार मॉड्यूल

पायथन, अपनी समृद्ध मानक लाइब्रेरी और उपयोगकर्ता के अनुकूल वाक्यविन्यास के साथ, कतारों को लागू करने और उनके साथ काम करने के लिए कई तंत्र प्रदान करता है। जबकि सभी कतार प्रबंधन के मूल उद्देश्य को पूरा करते हैं, वे अपनी बारीकियों, फायदे और संभावित नुकसान के साथ आते हैं। आइए प्रत्येक दृष्टिकोण का विश्लेषण करें, इसकी यांत्रिकी और सर्वोत्तम उपयोग के मामलों का वर्णन करें।

नोट: संचालन करने से पहले हमेशा अपनी कतार की स्थिति जांचें। उदाहरण के लिए, कतार हटाने से पहले, त्रुटियों से बचने के लिए सत्यापित करें कि कतार खाली है या नहीं। इसी तरह, बंधी हुई कतारों के लिए, सुनिश्चित करें कि कतार में लगने से पहले जगह हो।

कतारों को लागू करने के लिए पायथन सूचियों का उपयोग करना

कतारों को लागू करने के लिए पायथन की अंतर्निहित सूचियों का उपयोग करना सहज और सीधा है। बाहरी पुस्तकालयों या जटिल डेटा संरचनाओं की कोई आवश्यकता नहीं है। हालाँकि, यह दृष्टिकोण बड़े डेटासेट के लिए कुशल नहीं हो सकता है। किसी सूची की शुरुआत से एक तत्व को हटाना (pop(0)) रैखिक समय लेता है, जिससे प्रदर्शन संबंधी समस्याएं पैदा हो सकती हैं।

नोट: उच्च प्रदर्शन की मांग करने वाले या बड़ी मात्रा में डेटा से निपटने वाले अनुप्रयोगों के लिए, स्विच करें collections.deque कतारबद्ध करने और कतारबद्ध करने दोनों के लिए निरंतर समय जटिलता के लिए।

आइए अपनी कतार का प्रतिनिधित्व करने के लिए एक सूची बनाकर शुरुआत करें:

queue = []

तत्वों को कतार के अंत में जोड़ने (पंक्तिबद्ध करना) की प्रक्रिया उन्हें सूची में जोड़ने के अलावा और कुछ नहीं है:


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) 

साथ ही, कतार के सामने से तत्व को हटाना (पंक्तिबद्ध करना) सूची के पहले तत्व को हटाने के बराबर है:


queue.pop(0)
print(queue) 

का प्रयोग कलेक्शंस.डेक्यू कतारों को लागू करने के लिए

यह दृष्टिकोण अत्यधिक कुशल है deque का उपयोग करके कार्यान्वित किया जाता है दोहरी रूप से जुड़ी हुई सूची. यह दोनों सिरों से तेज़ O(1) एपेंड और पॉप को सपोर्ट करता है। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह है थोड़ा शुरुआती लोगों के लिए कम सहज ज्ञान युक्त।

सबसे पहले, हम आयात करेंगे deque वस्तु से collections मॉड्यूल और हमारी कतार प्रारंभ करें:

from collections import deque queue = deque()

अब, हम उपयोग कर सकते हैं append() तत्वों को कतारबद्ध करने की विधि और popleft() कतार से तत्वों को हटाने की विधि:

सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) queue.popleft()
print(queue) 

पायथन का उपयोग करना पंक्ति कतारों को लागू करने के लिए मॉड्यूल

RSI queue पायथन की मानक लाइब्रेरी में मॉड्यूल विभिन्न उपयोग के मामलों को पूरा करते हुए, कतार प्रबंधन के लिए एक अधिक विशिष्ट दृष्टिकोण प्रदान करता है:

  • सरल कतार - एक बुनियादी फीफो कतार
  • लिफ़ोक्यू - एक LIFO कतार, अनिवार्य रूप से एक स्टैक
  • प्राथमिकता कतार - तत्वों को उनकी निर्दिष्ट प्राथमिकता के आधार पर हटा दिया जाता है

नोट: के लिए विकल्प चुनें 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!")

कौन सा कार्यान्वयन चुनना है?

पायथन में कतार कार्यान्वयन की आपकी पसंद आपके एप्लिकेशन की आवश्यकताओं के अनुरूप होनी चाहिए। यदि आप बड़ी मात्रा में डेटा संभाल रहे हैं या अनुकूलित प्रदर्शन की आवश्यकता है, collections.deque एक सम्मोहक विकल्प है. हालाँकि, बहु-थ्रेडेड अनुप्रयोगों के लिए या जब प्राथमिकताएँ चलन में आती हैं, तो queue मॉड्यूल मजबूत समाधान प्रदान करता है। त्वरित स्क्रिप्ट के लिए या जब आप अभी शुरुआत कर रहे हों, तो पायथन सूचियाँ पर्याप्त हो सकती हैं, लेकिन संभावित प्रदर्शन संबंधी कमियों से हमेशा सावधान रहें।

नोट: जब पायथन पहले से ही शक्तिशाली अंतर्निहित समाधान प्रदान करता है तो कतार संचालन को कस्टम-कार्यान्वयन करके पहिया को फिर से आविष्कार करना।
कस्टम समाधान तैयार करने से पहले, अपने आप को पायथन की अंतर्निहित पेशकशों से परिचित कराएं deque और queue मापांक। अक्सर, वे आवश्यकताओं की एक विस्तृत श्रृंखला को पूरा करते हैं, समय बचाते हैं और संभावित त्रुटियों को कम करते हैं।

डाइव डीपर: पायथन में उन्नत कतार अवधारणाएँ

उन लोगों के लिए जिन्होंने कतारों की बुनियादी यांत्रिकी को समझ लिया है और गहराई में जाने के लिए उत्सुक हैं, पायथन कतार-आधारित संचालन को परिष्कृत और अनुकूलित करने के लिए उन्नत अवधारणाओं और तकनीकों की एक बड़ी श्रृंखला प्रदान करता है। आइए इनमें से कुछ परिष्कृत पहलुओं को उजागर करें, जिससे आपको अधिक जटिल परिदृश्यों से निपटने के लिए उपकरणों का एक शस्त्रागार मिलेगा।

के साथ डबल-एंडेड कतारें Deque

जबकि हमने पहले भी खोजबीन की है deque FIFO कतार के रूप में, यह LIFO (लास्ट-इन-फर्स्ट-आउट) संचालन का भी समर्थन करता है। यह आपको O(1) जटिलता के साथ दोनों सिरों से तत्वों को जोड़ने या पॉप करने की अनुमति देता है:

from collections import deque dq = deque()
dq.appendleft('A') dq.append('B') dq.pop() dq.popleft() 

प्राथमिकता क्यू लड़ाई में

जब प्रसंस्करण का क्रम प्राथमिकता पर निर्भर होता है तो एक सरल फीफो कतार का उपयोग करने से अक्षमताएं या अवांछित परिणाम हो सकते हैं, इसलिए, यदि आपके आवेदन के लिए आवश्यक है कि कुछ मानदंडों के आधार पर कुछ तत्वों को दूसरों से पहले संसाधित किया जाए, तो एक को नियोजित करें PriorityQueue. यह सुनिश्चित करता है कि तत्वों को उनकी निर्धारित प्राथमिकताओं के आधार पर संसाधित किया जाता है।

इस पर एक नज़र डालें कि हम उन तत्वों के लिए प्राथमिकताएँ कैसे निर्धारित करते हैं जिन्हें हम कतार में जोड़ रहे हैं। इसके लिए आवश्यक है कि हम एक टुपल को तर्क के रूप में पारित करें put() तरीका। टपल में पहले तत्व के रूप में प्राथमिकता और दूसरे तत्व के रूप में वास्तविक मान शामिल होना चाहिए:

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) 

निष्कर्ष

कतारें, मौलिक फिर भी शक्तिशाली, विभिन्न वास्तविक दुनिया के अनुप्रयोगों और कम्प्यूटेशनल समस्याओं में अपना सार ढूंढती हैं। ऑपरेटिंग सिस्टम में कार्य शेड्यूलिंग से लेकर प्रिंट स्पूलर या वेब सर्वर अनुरोधों में डेटा प्रवाह को प्रबंधित करने तक, कतारों के निहितार्थ दूरगामी हैं।

पायथन कतारों के साथ काम करने के लिए टूल और लाइब्रेरी का एक समृद्ध पैलेट लाता है। त्वरित स्क्रिप्ट के लिए सरल सूची-आधारित कतारों से लेकर अत्यधिक कुशल तक deque प्रदर्शन-महत्वपूर्ण अनुप्रयोगों के लिए, भाषा वास्तव में कई प्रकार की आवश्यकताओं को पूरा करती है।

स्पॉट_आईएमजी

नवीनतम खुफिया

स्पॉट_आईएमजी