Pythoni järjekordade juhend

Pythoni järjekordade juhend

Sissejuhatus

Alates lihtsate täisarvude salvestamisest kuni keerukate töövoogude haldamiseni loovad andmestruktuurid aluse tugevatele rakendustele. Nende hulgas on järjekorda sageli ilmneb nii intrigeeriva kui ka üldlevina. Mõelge sellele – a järjekord pangas, kiirtoiduleti juures oma järge ootamine või arvutisüsteemis ülesannete puhverdamine – kõik need stsenaariumid vastavad järjekorra mehaanikale.

Esimesena teenindatakse järjekorras esimest inimest ja uued saabujad liituvad lõpus. See on näide tegelikust elust järjekorrast!

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

Arendajate jaoks, eriti Pythonis, ei ole järjekorrad pelgalt arvutiteaduse õpiku teoreetilised konstruktsioonid. Need moodustavad paljude rakenduste aluseks oleva arhitektuuri. Alates ülesannete haldamisest printeris kuni sujuva andmevoo tagamiseni otseülekannetes on järjekorrad asendamatu roll.

Selles juhendis uurime sügavalt järjekordade kontseptsiooni, uurime nende omadusi, reaalmaailma rakendusi ja mis kõige tähtsam, kuidas neid Pythonis tõhusalt rakendada ja kasutada.

Mis on järjekorra andmestruktuur?

Andmestruktuuride maastikul liikudes kohtame sageli konteinereid, millel on andmete sisestamiseks ja toomiseks erinevad reeglid. Nende hulgas on järjekorda paistab silma elegantsuse ja otsekohesuse poolest.

FIFO põhimõte

Järjekord on oma olemuselt lineaarne andmestruktuur, mis järgib Esimene sisse-välja (FIFO) põhimõte. See tähendab, et esimene element, mis järjekorda lisatakse, eemaldatakse esimesena. Võrreldes seda võrreldava stsenaariumiga: kaaluge piletikassa juures olevat klientide rida. Esimesena saabunud inimene saab oma pileti esimesena ja kõik järgnevad saabujad rivistuvad lõpus ja ootavad oma järjekorda.

Märge: Järjekorral on kaks otsa – taga ja ees. Esikülg näitab, kust elemendid eemaldatakse, ja tagumine näitab, kus uusi elemente lisatakse.

Põhilised järjekorratoimingud

  • Järjekord – tegu lisades element lõpuni (tagumine) järjekorrast.

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

  • Järjekorrast lahkumine – tegu eemaldades element pärit esi- järjekorrast.

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

  • Peek või Front – Paljudes olukordades on kasulik esiosa lihtsalt jälgida ilma seda eemaldamata. See toiming võimaldab meil just seda teha.

  • On tühi – Toiming, mis aitab kindlaks teha, kas järjekorras on elemente. See võib olla ülioluline stsenaariumide puhul, kus toimingud sõltuvad andmete olemasolust.

Märge: Kuigi mõned järjekorrad on piiratud suurusega (piiratud järjekorrad), võivad teised kasvada seni, kuni süsteemimälu seda võimaldab (piiramata järjekorrad).

Järjekordade lihtsus ja selged tööreeglid muudavad need ideaalseks mitmesuguste tarkvaraarenduse rakenduste jaoks, eriti stsenaariumide korral, mis nõuavad korrapärast ja süstemaatilist töötlemist.

Teooria mõistmine on aga alles esimene samm. Edasi liikudes süveneme praktilistesse aspektidesse, illustreerides, kuidas Pythonis järjekordi rakendada.

Järjekordade rakendamine Pythonis – loendid vs. deque vs. järjekordade moodul

Python oma rikkaliku standardteegi ja kasutajasõbraliku süntaksiga pakub mitmeid mehhanisme järjekordade rakendamiseks ja nendega töötamiseks. Kuigi kõik täidavad järjekorra haldamise põhieesmärki, on neil oma nüansid, eelised ja võimalikud lõksud. Lahkame iga lähenemisviisi, illustreerides selle mehaanikat ja parimaid kasutusjuhtumeid.

Märge: Enne toimingute tegemist kontrollige alati oma järjekorra olekut. Näiteks enne järjekorrast vabastamist kontrollige, kas järjekord on vigade vältimiseks tühi. Piiratud järjekordade puhul veenduge, et enne järjekorda seadmist oleks ruumi.

Pythoni loendite kasutamine järjekordade rakendamiseks

Pythoni sisseehitatud loendite kasutamine järjekordade rakendamiseks on intuitiivne ja arusaadav. Pole vaja väliseid teeke ega keerulisi andmestruktuure. See lähenemisviis ei pruugi aga suurte andmekogumite puhul olla tõhus. Elemendi eemaldamine loendi algusest (pop(0)) võtab lineaarset aega, mis võib põhjustada jõudlusprobleeme.

Märge: Rakenduste jaoks, mis nõuavad suurt jõudlust või mis tegelevad märkimisväärse andmemahuga, lülitage sisse collections.deque pideva ajalise keerukuse tagamiseks nii järjekorda seadmisel kui ka järjekorrast vabastamisel.

Alustame loendi loomisega, mis esindab meie järjekorda:

queue = []

Elementide järjekorra lõppu lisamine (järjekorra loomine) ei ole midagi muud kui nende lisamine loendisse:


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

Samuti võrdub elemendi eemaldamine järjekorra esiosast (järjekorrast vabastamine) lihtsalt loendi esimese elemendi eemaldamisega:


queue.pop(0)
print(queue) 

Kasutamine kogud.deque Järjekordade juurutamiseks

See lähenemisviis on väga tõhus, kuna deque rakendatakse kasutades a topeltlingitud loend. See toetab kiiret O(1) lisamist ja hüppamist mõlemast otsast. Selle lähenemisviisi negatiivne külg on see, et see on veidi algajatele vähem intuitiivne.

Kõigepealt impordime deque objekt alates collections moodul ja lähtestage meie järjekord:

from collections import deque queue = deque()

Nüüd saame kasutada append() elementide järjekorda seadmise meetod ja popleft() meetod elementide järjekorrast eemaldamiseks:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!


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

Pythoni kasutamine järjekorda Järjekordade rakendamise moodul

. queue Pythoni standardteegi moodul pakub spetsiifilisemat lähenemist järjekorra haldamisele, pakkudes erinevaid kasutusjuhtumeid:

  • SimpleQueue – Põhiline FIFO järjekord
  • LifoQueue – LIFO järjekord, sisuliselt virn
  • Prioriteedijärjekord – Elemendid eemaldatakse järjekorrast neile määratud prioriteedi alusel

Märge: Valida queue moodul, mis on mõeldud olema niit ohutu. See tagab, et samaaegsed toimingud järjekorras ei too kaasa ettearvamatuid tulemusi.

See lähenemisviis on suurepärane, kuna see on spetsiaalselt loodud järjekorratoimingute jaoks. Kuid ausalt öeldes võib see lihtsate stsenaariumide jaoks olla liialdatud.

Nüüd hakkame kasutama queue moodul, importides selle meie projekti:

import queue

Kuna me rakendame lihtsat FIFO järjekorda, siis lähtestame selle kasutades SimpleQueue() konstruktor:

q = queue.SimpleQueue()

Järjekorra ja järjekorra eemaldamise toiminguid rakendatakse kasutades put() ja get() meetodid alates queue moodul:


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

Märge: Järjekorratoimingud võivad tekitada erandeid, mis kui neid ei käsitleta, võivad teie rakenduse voogu häirida. Selle vältimiseks mähkige järjekorratoimingud sisse try-except plokid.

Näiteks käsitlege queue.Empty erand, kui töötate koos queue moodul:

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

Millist rakendust valida?

Teie valik Pythonis kasutatava järjekorra rakendamiseks peaks vastama teie rakenduse nõuetele. Kui tegelete suure andmemahuga või vajate optimeeritud jõudlust, collections.deque on kaalukas valik. Mitme keermega rakenduste puhul või kui mängu tulevad prioriteedid, queue moodul pakub tugevaid lahendusi. Kiirete skriptide jaoks või alles alustades võib Pythoni loenditest piisata, kuid olge alati ettevaatlik võimalike jõudlusprobleemide suhtes.

Märge: Ratta leiutamine järjekorratoimingute kohandatud rakendamisega, kui Python pakub juba võimsaid sisseehitatud lahendusi.
Enne kohandatud lahenduste loomist tutvuge Pythoni sisseehitatud pakkumistega, nagu deque ja queue moodul. Enamasti täidavad need laia valikut nõudeid, säästes aega ja vähendades võimalikke vigu.

Sukeldu sügavamale: Pythoni täpsemad järjekorrakontseptsioonid

Neile, kes on aru saanud järjekordade põhimehhanismidest ja soovivad süveneda, pakub Python hulgaliselt täiustatud kontseptsioone ja tehnikaid järjekorrapõhiste toimingute täpsustamiseks ja optimeerimiseks. Avastame mõned neist keerukatest aspektidest, andes teile hulga tööriistu keerukamate stsenaariumide lahendamiseks.

Kahe otsaga järjekorrad koos millest

Kuigi oleme varem uurinud deque FIFO järjekorrana toetab see ka LIFO (Last-In-First-Out) toiminguid. See võimaldab teil lisada või poputada elemente mõlemast otsast O(1) keerukusega:

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

PriorityQueu tegevuses

Lihtsa FIFO-järjekorra kasutamine, kui töötlemise järjekord sõltub prioriteedist, võib põhjustada ebaefektiivsust või soovimatuid tulemusi, nii et kui teie taotlus nõuab teatud elementide töötlemist enne teisi teatud kriteeriumide alusel, kasutage PriorityQueue. See tagab, et elemente töödeldakse nende seatud prioriteetide alusel.

Vaadake, kuidas seame järjekorda lisatavate elementide prioriteedid. See eeldab, et me edastame korteeži argumendina put() meetod. Korpus peaks esimese elemendina sisaldama prioriteeti ja teise elemendina tegelikku väärtust:

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

See annab meile järgmise:

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

Pange tähele, kuidas lisasime elemente järjekorda salvestatust erinevas järjekorras. Selle põhjuseks on prioriteedid, mille oleme määranud put() meetodit elementide lisamisel prioriteetsesse järjekorda.

Ringjärjekorra rakendamine

Ringikujuline järjekord (või ringpuhver) on täiustatud andmestruktuur, kus viimane element on ühendatud esimesega, tagades ringvoolu. deque saab seda käitumist selle abil jäljendada maxlen Vara:

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) 

Järeldus

Järjekorrad, mis on fundamentaalsed, kuid võimsad, leiavad oma olemuse mitmesugustes reaalsetes rakendustes ja arvutusprobleemides. Järjekordade tagajärjed on kaugeleulatuvad, alates operatsioonisüsteemides tööülesannete planeerimisest kuni andmevoo haldamiseni prindispuulerites või veebiserveri päringutes.

Python toob järjekordadega töötamiseks lauale rikkaliku tööriistade ja teekide paleti. Alates lihtsatest loendipõhistest järjekordadest kiirete skriptide jaoks kuni ülitõhusateni deque jõudluskriitiliste rakenduste puhul vastab keel tõeliselt paljudele vajadustele.

Ajatempel:

Veel alates Stackabus