Útmutató a Python soraihoz

Útmutató a Python soraihoz

Bevezetés

Az egyszerű egész számok tárolásától az összetett munkafolyamatok kezeléséig az adatstruktúrák megalapozzák a robusztus alkalmazások alapjait. Közülük a sorban áll gyakran érdekesnek és mindenütt jelen lévőnek tűnik. Gondolj bele – a sor a bankban, egy gyorséttermi pultnál várva a sorára vagy a feladatok pufferelésére egy számítógépes rendszerben – mindezek a forgatókönyvek összecsengenek a sor mechanikájával.

A sorban első személyt szolgálják ki először, az újonnan érkezők pedig a végén csatlakoznak. Ez egy valós példa a sor működésére!

guide-to-queues-in-python-01.png

A fejlesztők számára, különösen a Pythonban, a sorok nem csupán elméleti konstrukciók egy számítástechnikai tankönyvből. Sok alkalmazásban ezek alkotják az alapul szolgáló architektúrát. A nyomtatási sorok nélkülözhetetlen szerepet játszanak a nyomtatóban végzett feladatok kezelésétől az élő adások zökkenőmentes adatfolyamának biztosításáig.

Ebben az útmutatóban mélyen elmélyülünk a várólisták fogalmában, feltárjuk jellemzőiket, a valós alkalmazásokat, és ami a legfontosabb, hogyan lehet hatékonyan implementálni és használni őket Pythonban.

Mi az a várólista adatstruktúra?

Az adatstruktúrák táján navigálva gyakran találkozunk olyan tárolókkal, amelyeknek külön szabályai vannak az adatbevitelre és -lekérésre. Ezek közül a sorban áll eleganciájával és egyenességével tűnik ki.

A FIFO-elv

Lényegében a sor egy lineáris adatstruktúra, amely megfelel a Első-első-kimenő (FIFO) elv. Ez azt jelenti, hogy a sorhoz elsőként hozzáadott elem lesz az első, amelyet eltávolítanak. Ha egy összehasonlítható forgatókönyvhöz hasonlítjuk: vegye figyelembe a vásárlók sorát a jegypénztárnál. Az elsőként érkező személy kapja meg először a jegyét, a később érkezők pedig a végén sorakoznak, és várják a sorukat.

Jegyzet: A sornak két vége van – hátul és elöl. Az elülső oldal jelzi, hogy hol lesznek eltávolítva az elemek, a hátul pedig azt, hogy hol lesznek új elemek.

Alapvető sorműveletek

  • Sorba állítás – A cselekmény hozzáadásával egy elem a végéig (hátulsó) a sorból.

    guide-to-queues-in-python-02.png

  • Sorból – A cselekmény eltávolítása egy elem a front a sorból.

    guide-to-queues-in-python-03.png

  • Peek vagy Front – Sok esetben előnyös az elülső elem megfigyelése anélkül, hogy eltávolítaná. Ez a művelet éppen ezt teszi lehetővé.

  • Üres – Művelet, amely segít meghatározni, hogy a várólista tartalmaz-e elemeket. Ez kulcsfontosságú lehet olyan forgatókönyvekben, ahol a műveletek attól függnek, hogy a várólista adatok legyenek.

Jegyzet: Míg egyes sorok mérete korlátozott (korlátozott sorok), mások potenciálisan növekedhetnek, ameddig a rendszermemória lehetővé teszi (korlátlan sorok).

A várólisták egyszerűsége és egyértelmű működési szabályai ideálissá teszik őket a szoftverfejlesztés számos alkalmazásához, különösen a rendezett és szisztematikus feldolgozást igénylő forgatókönyvekben.

Az elmélet megértése azonban csak az első lépés. Ahogy haladunk előre, elmélyülünk a gyakorlati szempontokba, bemutatva, hogyan kell a várólistákot megvalósítani Pythonban.

Várólisták megvalósítása Pythonban – Listák vs. Deque vs. Queue modul

A Python gazdag szabványkönyvtárával és felhasználóbarát szintaxisával számos mechanizmust biztosít a várólisták megvalósításához és kezeléséhez. Bár mindegyik a sorkezelés alapvető célját szolgálja, megvannak a maguk árnyalatai, előnyei és potenciális buktatói. Vizsgáljuk meg az egyes megközelítéseket, illusztrálva azok mechanikáját és a legjobb felhasználási eseteket.

Jegyzet: A műveletek végrehajtása előtt mindig ellenőrizze a sor állapotát. Például a sorba állítás előtt ellenőrizze, hogy a sor üres-e a hibák elkerülése érdekében. Hasonlóképpen, a korlátos sorok esetében győződjön meg arról, hogy van hely, mielőtt sorba állítja.

Python listák használata várólisták megvalósításához

A Python beépített listáinak használata a várólisták megvalósítására intuitív és egyszerű. Nincs szükség külső könyvtárakra vagy összetett adatstruktúrákra. Ez a megközelítés azonban nem biztos, hogy hatékony nagy adatkészletek esetén. Elem eltávolítása a lista elejéről (pop(0)) lineáris időt vesz igénybe, ami teljesítménybeli problémákat okozhat.

Jegyzet: Nagy teljesítményt igénylő vagy jelentős adatmennyiséggel foglalkozó alkalmazások esetén váltson a következőre collections.deque az állandó időbonyolítás érdekében mind a sorbaállításnál, mind a sorkiürítésnél.

Kezdjük azzal, hogy hozzunk létre egy listát, amely megjeleníti a sorunkat:

queue = []

Az elemek sor végéhez adásának folyamata (sorba állítás) nem más, mint hozzáfűzni őket a listához:


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

Ezenkívül az elem eltávolítása a sor elejéről (sorba rendezés) egyenértékű a lista első elemének eltávolításával:


queue.pop(0)
print(queue) 

<p></p> gyűjtemények.deque a Várólisták megvalósításához

Ez a megközelítés rendkívül hatékony, mint deque segítségével valósítják meg a duplán linkelt lista. Támogatja a gyors O(1) hozzáfűzést és felbukkanást mindkét végéről. Ennek a megközelítésnek az a hátránya, hogy az némileg kevésbé intuitív kezdőknek.

Először is importáljuk a deque tárgy a collections modult és inicializáljuk a sorunkat:

from collections import deque queue = deque()

Most már használhatjuk a append() metódus az elemek sorba rendezéséhez és a popleft() módszer az elemek sorból való törlésére:

Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!


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

A Python használata sorban áll Modul a sorok megvalósításához

A queue A Python szabványos könyvtárának modulja speciálisabb megközelítést biztosít a sorkezeléshez, különféle felhasználási eseteket biztosítva:

  • SimpleQueue – Egy alap FIFO-sor
  • LifoQueue – Egy LIFO-sor, lényegében egy verem
  • PriorityQueue – Az elemek a hozzájuk rendelt prioritás alapján törlődnek a sorból

Jegyzet: Válaszd a queue modult, amelyet arra terveztek menetbiztos. Ez biztosítja, hogy a sorban végrehajtott párhuzamos műveletek ne vezessenek előre nem látható eredményekhez.

Ez a megközelítés nagyszerű, mert kifejezetten a várólista műveletekhez készült. De, hogy őszinte legyek, ez túlzás lehet az egyszerű forgatókönyveknél.

Most kezdjük el használni a queue modult a projektünkbe történő importálással:

import queue

Mivel egy egyszerű FIFO-sort valósítunk meg, a következővel inicializáljuk SimpleQueue() konstruktőr:

q = queue.SimpleQueue()

A sorbaállítási és -kiállítási műveletek a segítségével valósulnak meg put() és a get() módszerek a queue modul:


q.put('A')
q.put('B')
q.put('C')
print(q.queue) q.get()
print(q.queue) 

Jegyzet: A sorműveletek kivételeket hozhatnak létre, amelyek kezelés nélkül megzavarhatják az alkalmazás folyamatát. Ennek elkerülése érdekében csomagolja be a sorműveleteket try-except blokkokat.

Például kezelje a queue.Empty kivétel, ha a queue modul:

import queue q = queue.SimpleQueue() try: item = q.get_nowait()
except queue.Empty: print("Queue is empty!")

Melyik megvalósítást válasszuk?

A Pythonban választott sormegvalósításnak meg kell felelnie az alkalmazás követelményeinek. Ha nagy mennyiségű adatot kezel, vagy optimalizált teljesítményre van szüksége, collections.deque meggyőző választás. Azonban a többszálas alkalmazásoknál, vagy amikor a prioritások kerülnek szóba, a queue modul robusztus megoldásokat kínál. Gyors szkriptekhez, vagy amikor éppen most kezdi, a Python listák elegendőek lehetnek, de mindig óvakodjunk a teljesítmény esetleges buktatóitól.

Jegyzet: Újra feltalálni a kereket a sorműveletek egyedi megvalósításával, amikor a Python már hatékony beépített megoldásokat kínál.
Mielőtt egyedi megoldásokat készítene, ismerkedjen meg a Python beépített ajánlataival, mint pl deque és a queue modul. Leggyakrabban a követelmények széles skáláját elégítik ki, időt takarítanak meg és csökkentik a lehetséges hibákat.

Merülj mélyebbre: Speciális sorfogalmak a Pythonban

Azok számára, akik megértették a várólisták alapvető mechanikáját, és szeretnének mélyebbre ásni, a Python rengeteg fejlett koncepciót és technikát kínál a várólista alapú műveletek finomításához és optimalizálásához. Fedezzünk fel néhányat ezek közül a kifinomult szempontok közül, és eszközök arzenálját kínáljuk a bonyolultabb forgatókönyvek kezelésére.

Kétvégű Queues with miről

Miközben korábban feltártuk deque FIFO-sorként a LIFO (Last-In-First-Out) műveleteket is támogatja. Lehetővé teszi, hogy O(1) komplexitású elemeket fűzzünk hozzá vagy popoljunk fel mindkét végéről:

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

PriorityQueu akcióban

Egy egyszerű FIFO-sor használata, amikor a feldolgozás sorrendje prioritástól függ, hatékonysághiányhoz vagy nem kívánt eredményekhez vezethet, ezért ha az alkalmazás megköveteli, hogy bizonyos feltételek alapján bizonyos elemeket a többi előtt dolgozzanak fel, használjon egy PriorityQueue. Ez biztosítja, hogy az elemek a beállított prioritások szerint dolgozzanak fel.

Vessen egy pillantást arra, hogyan állítjuk be a prioritásokat a sorhoz hozzáadott elemekhez. Ez megköveteli, hogy adjuk meg a sor argumentumaként a put() módszer. A sor első elemeként a prioritást, második elemként a tényleges értéket kell tartalmaznia:

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}")

Ezzel a következőket kapjuk:

Processing: Task A
Processing: Task B
Processing: Task C

Vegye figyelembe, hogy az elemeket a sorban tárolttól eltérő sorrendben adtuk hozzá. Ez annak köszönhető, hogy milyen prioritásokat osztottunk ki a dokumentumban put() módszert, amikor elemeket ad hozzá a prioritási sorhoz.

Körkörös várólista megvalósítása

A körkörös sor (vagy gyűrűpuffer) olyan fejlett adatstruktúra, amelyben az utolsó elem az elsőhöz kapcsolódik, biztosítva a körkörös áramlást. deque segítségével utánozhatja ezt a viselkedést maxlen ingatlan:

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) 

Következtetés

Az alapvető, de erőteljes várólisták a valós alkalmazások és számítási problémák széles skálájában találják meg lényegüket. Az operációs rendszerekben végzett feladatütemezéstől a nyomtatási sorkezelők adatfolyamának kezeléséig vagy a webszerver-kérelmekig a várólisták messzemenő következményekkel járnak.

A Python eszközök és könyvtárak gazdag palettáját hozza az asztalra a várólisták kezeléséhez. A gyors szkriptek egyszerű listaalapú soraitól a rendkívül hatékonyakig deque a teljesítménykritikus alkalmazások esetében a nyelv valóban megfelel az igények széles skálájának.

Időbélyeg:

Még több Stackabus