Opas jonoihin Pythonissa

Opas jonoihin Pythonissa

esittely

Tietorakenteet luovat perustan kestäville sovelluksille yksinkertaisten kokonaislukujen tallentamisesta monimutkaisten työnkulkujen hallintaan. Heidän joukossaan on jono esiintyy usein sekä kiehtovana että kaikkialla esiintyvänä. Ajattele sitä – a linja pankissa, vuoroasi odottaminen pikaruokatiskillä tai tehtävien puskurointi tietokonejärjestelmässä – kaikki nämä skenaariot resonoivat jonon mekaniikan kanssa.

Jonon ensimmäinen henkilö palvellaan ensin, ja uudet tulokkaat liittyvät lopussa. Tämä on tosielämän esimerkki jonosta toiminnassa!

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

Kehittäjille, varsinkin Pythonissa, jonot eivät ole vain teoreettisia rakenteita tietojenkäsittelytieteen oppikirjasta. Ne muodostavat taustalla olevan arkkitehtuurin monissa sovelluksissa. Jonot ovat korvaamaton rooli tulostimen tehtävien hallinnasta saumattomasti suorien lähetysten tietovirtojen varmistamiseen.

Tässä oppaassa perehdymme syvälle jonojen käsitteeseen, tutkimme niiden ominaisuuksia, todellisia sovelluksia ja mikä tärkeintä, kuinka ne voidaan ottaa tehokkaasti käyttöön ja käyttää Pythonissa.

Mikä on jonotietorakenne?

Tietorakenteiden maisemissa liikkuessamme kohtaamme usein säilöjä, joilla on erilliset säännöt tiedon syöttämiselle ja haulle. Näistä mm jono erottuu tyylikkyydestään ja yksinkertaisuudestaan.

FIFO-periaate

Jono on pohjimmiltaan lineaarinen tietorakenne, joka noudattaa First-in-First-Out (FIFO) periaate. Tämä tarkoittaa, että ensimmäinen jonoon lisätty elementti poistetaan ensimmäisenä. Vertaaksesi sitä suhteelliseen skenaarioon: harkitse asiakasjonoa lipputiskillä. Ensimmäisenä saapuva henkilö saa lippunsa ensin, ja kaikki myöhemmät saapuvat joutuvat lopussa odottamaan vuoroaan.

Huomautus: Jonolla on kaksi päätä - takana ja edessä. Etuosa osoittaa, mistä elementit poistetaan, ja takaosa osoittaa, mihin uusia elementtejä lisätään.

Perusjonon toiminnot

  • Jono – Teko lisää elementti loppuun asti (takaosa) jonosta.

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

  • Poistaa jonosta – Teko poistamalla elementti kohteesta etuosa jonosta.

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

  • Kurkista tai Edessä – Monissa tilanteissa on hyödyllistä vain tarkkailla etuelementtiä irrottamatta sitä. Tämä operaatio antaa meille mahdollisuuden tehdä juuri sen.

  • On tyhjä – Toiminto, joka auttaa määrittämään, onko jonossa elementtejä. Tämä voi olla ratkaisevan tärkeää skenaarioissa, joissa toiminnot ovat riippuvaisia ​​jonosta, jolla on tietoja.

Huomautus: Vaikka joidenkin jonojen koko on rajoitettu (rajoitetut jonot), toiset voivat mahdollisesti kasvaa niin kauan kuin järjestelmämuisti sallii (rajoittamattomat jonot).

Jonojen yksinkertaisuus ja selkeät toimintasäännöt tekevät niistä ihanteellisia erilaisiin ohjelmistokehityksen sovelluksiin, erityisesti säännöllistä ja systemaattista käsittelyä vaativissa skenaarioissa.

Teorian ymmärtäminen on kuitenkin vasta ensimmäinen askel. Kun siirrymme eteenpäin, syvennymme käytännön näkökohtiin, havainnollistaen kuinka toteuttaa jonoja Pythonissa.

Jonojen käyttöönotto Pythonissa – Listat vs. Deque vs. Queue -moduuli

Python, jossa on rikas standardikirjasto ja käyttäjäystävällinen syntaksi, tarjoaa useita mekanismeja jonojen toteuttamiseen ja käsittelyyn. Vaikka kaikki palvelevat jononhallinnan perustarkoitusta, niissä on vivahteitaan, etujaan ja mahdollisia sudenkuoppiaan. Tarkastellaan jokaista lähestymistapaa havainnollistaen sen mekaniikkaa ja parhaita käyttötapauksia.

Huomautus: Tarkista aina jonosi tila ennen toimintojen suorittamista. Tarkista esimerkiksi ennen jonosta poistamista, onko jono tyhjä virheiden välttämiseksi. Samoin rajoitettujen jonojen kohdalla varmista, että tilaa on ennen jonoon asettamista.

Python-luetteloiden käyttäminen jonojen toteuttamiseen

Pythonin sisäänrakennettujen luetteloiden käyttäminen jonojen toteuttamiseen on intuitiivista ja yksinkertaista. Ulkoisia kirjastoja tai monimutkaisia ​​tietorakenteita ei tarvita. Tämä lähestymistapa ei kuitenkaan välttämättä ole tehokas suurille tietojoukoille. Elementin poistaminen luettelon alusta (pop(0)) vie lineaarista aikaa, mikä voi aiheuttaa suorituskykyongelmia.

Huomautus: Vaihda sovelluksiin, jotka vaativat korkeaa suorituskykyä tai jotka käsittelevät paljon dataa collections.deque jatkuvan ajan monimutkaisuuden vuoksi sekä jonossa että jonosta poistamisessa.

Aloitetaan luomalla luettelo, joka edustaa jonoamme:

queue = []

Elementtien lisääminen jonon loppuun (jono) ei ole muuta kuin niiden lisääminen luetteloon:


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

Myös elementin poistaminen jonon edestä (jonosta poistaminen) vastaa vain luettelon ensimmäisen elementin poistamista:


queue.pop(0)
print(queue) 

Käyttäminen kokoelmat.deque toteuttaa jonoja

Tämä lähestymistapa on erittäin tehokas mm deque toteutetaan käyttämällä a kaksinkertaisesti linkitetty luettelo. Se tukee nopeita O(1) lisäyksiä ja ponnahduksia molemmista päistä. Tämän lähestymistavan haittapuoli on, että se on hieman vähemmän intuitiivinen aloittelijoille.

Ensin tuomme deque objekti collections moduuli ja alusta jonomme:

from collections import deque queue = deque()

Nyt voimme käyttää append() menetelmä elementtien jonottamiseksi ja popleft() menetelmä elementtien poistamiseksi jonosta:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!


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

Pythonin käyttäminen jono Moduuli jonojen toteuttamiseen

- queue Pythonin vakiokirjaston moduuli tarjoaa erikoistuneemman lähestymistavan jonojen hallintaan eri käyttötapauksissa:

  • SimpleQueue – FIFO-perusjono
  • LifoQueue – LIFO-jono, lähinnä pino
  • prioriteettijono – Elementit poistetaan jonosta niille määritetyn prioriteetin perusteella

Huomautus: Valitse queue moduuli, joka on suunniteltu käytettäväksi lanka turvassa. Tämä varmistaa, että samanaikaiset toiminnot jonossa eivät johda arvaamattomiin tuloksiin.

Tämä lähestymistapa on loistava, koska se on suunniteltu nimenomaan jonotoimintoihin. Mutta ollakseni täysin rehellinen, se saattaa olla liioittelua yksinkertaisissa skenaarioissa.

Nyt aletaan käyttää queue moduuli tuomalla se projektiimme:

import queue

Koska toteutamme yksinkertaisen FIFO-jonon, alustamme sen käyttämällä SimpleQueue() rakentaja:

q = queue.SimpleQueue()

Jonotus- ja purkutoiminnot toteutetaan käyttämällä put() ja get() menetelmät queue moduuli:


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

Huomautus: Jonotoiminnot voivat aiheuttaa poikkeuksia, jotka voivat häiritä sovelluksesi kulkua, jos niitä ei käsitellä. Tämän estämiseksi kääri jonotoiminnot sisään try-except lohkot.

Käsittele esimerkiksi queue.Empty poikkeus työskennellessäsi kanssa queue moduuli:

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

Mikä toteutus valita?

Pythonissa valitsemasi jonototeutuksen tulee vastata sovelluksesi vaatimuksia. Jos käsittelet suuria määriä dataa tai tarvitset optimoitua suorituskykyä, collections.deque on vakuuttava valinta. Kuitenkin monisäikeisissä sovelluksissa tai kun prioriteetit tulevat esiin, queue moduuli tarjoaa kestäviä ratkaisuja. Python-luettelot saattavat riittää nopeisiin komentosarjoihin tai kun olet vasta aloittamassa, mutta ole aina varovainen mahdollisten suorituskyvyn sudenkuoppien suhteen.

Huomautus: Pyörän keksiminen uudelleen toteuttamalla mukautettuja jonotoimintoja, kun Python tarjoaa jo tehokkaita sisäänrakennettuja ratkaisuja.
Ennen kuin luot mukautettuja ratkaisuja, tutustu Pythonin sisäänrakennettuun tarjontaan, kuten deque ja queue moduuli. Useimmiten ne vastaavat monenlaisia ​​vaatimuksia, mikä säästää aikaa ja vähentää mahdollisia virheitä.

Sukella syvemmälle: edistyneet jonokonseptit Pythonissa

Python tarjoaa joukon edistyneitä käsitteitä ja tekniikoita jonopohjaisten toimintojen tarkentamiseen ja optimointiin niille, jotka ovat ymmärtäneet jonojen perusmekaniikat ja haluavat syventyä. Selvitetään joitain näistä hienostuneista näkökohdista, mikä antaa sinulle arsenaalin työkaluja monimutkaisempiin skenaarioihin.

Kaksipäiset jonot mistä

Kun olemme aiemmin tutkineet deque FIFO-jonona se tukee myös LIFO-toimintoja (Last-In-First-Out). Sen avulla voit lisätä tai pop-elementtejä molemmista päistä O(1)-monimutkaisuudella:

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

PriorityQueu toiminnassa

Yksinkertaisen FIFO-jonon käyttäminen, kun käsittelyjärjestys on riippuvainen tärkeydestä, voi johtaa tehottomuuteen tai ei-toivottuihin tuloksiin, joten jos hakemuksesi edellyttää tiettyjen elementtien käsittelyä ennen muita joidenkin kriteerien perusteella, käytä PriorityQueue. Tämä varmistaa, että elementit käsitellään niille asetettujen prioriteettien mukaisesti.

Katso, kuinka asetamme prioriteetit jonoon lisäämillemme elementeille. Tämä edellyttää, että välitämme tupelin argumenttina put() menetelmä. Lukion tulee sisältää prioriteetti ensimmäisenä elementtinä ja todellinen arvo toisena elementtinä:

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

Tämä antaa meille seuraavan:

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

Huomaa, kuinka lisäsimme elementtejä eri järjestyksessä kuin se, joka on tallennettu jonoon. Tämä johtuu prioriteeteista, jotka olemme määrittäneet put() menetelmää lisättäessä elementtejä prioriteettijonoon.

Pyöreän jonon käyttöönotto

Pyöreä jono (tai rengaspuskuri) on kehittynyt tietorakenne, jossa viimeinen elementti on yhdistetty ensimmäiseen varmistaen pyöreän virtauksen. deque voi jäljitellä tätä käyttäytymistä käyttämällä sen maxlen omaisuus:

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) 

Yhteenveto

Jonot, jotka ovat perustavanlaatuisia mutta tehokkaita, löytävät olemuksensa erilaisissa todellisissa sovelluksissa ja laskentaongelmissa. Jonojen vaikutukset ovat kauaskantoisia aina käyttöjärjestelmien tehtävien ajoituksesta tulostuksen taustatulostuksen tai web-palvelinpyyntöjen tietovirran hallintaan.

Python tuo pöytään rikkaan paletin työkaluja ja kirjastoja jonojen käsittelyyn. Yksinkertaisista luettelopohjaisista jonoista nopeita komentosarjoja varten erittäin tehokkaisiin deque suorituskykykriittisissä sovelluksissa kieli todella palvelee erilaisia ​​tarpeita.

Aikaleima:

Lisää aiheesta Stackabus