›_ ebskola.lv
← 7.4 7.6 →

7.5 Iebūvēto funkciju efektivitāte

Stundas uzdevums: Tu proti rakstīt kārtošanas un meklēšanas algoritmus no nulles, kas palīdz saprast loģiku. Taču profesionālā izstrādē prioritāte ir koda efektivitāte un izpildes ātrums. Šajā stundā pētīsim, kāpēc Python iebūvētās funkcijas ātrdarbībā pārspēj mūsu pašu rakstīto kodu un kāpēc tās ir nozares standarts.

SR 2.4.19. (Tu izmanto gatavus algoritmus tipveida uzdevumu risēšanai)
SR 2.4.16. (Tu novērtē algoritmu sarežģītību un efektivitāti)

70 min darba sadalījums: 1. uzdevums (~20 min) - atjauno teorijas piemēru vai minimālo prototipu; 2. uzdevums (~25 min) - pielieto to galvenajā uzdevumā; 3. uzdevums (~25 min) - pārbaudi rezultātu, izlabo kļūdas un tikai beigās pieraksti vienu secinājumu. Papildus/4. līmeņa uzdevums ir paredzēts tikai tad, ja pamatdarbs ir pabeigts.

Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.

Teorija: Kāpēc iebūvētās funkcijas ir ātrākas?

Vides sagatavošana (Windows)

  1. Atver PowerShell.
  2. Ieej algoritmu mapē: cd Tema7_Algoritmi
  3. Izveido jaunu failu un atver to kodu redaktorā: ni iebuvetas_funkcijas.py; code iebuvetas_funkcijas.py

Praktiskie uzdevumi

1. uzdevums: "Lielākais ienaidnieks"

Atradīsim vājāko un spēcīgāko ienaidnieku datu masīvā, izmantojot vienas rindas iebūvētās komandas.

  1. Atver darba failu vai rīku. Python sagatavi ievieto main.py failā un palaid no termināļa.
  2. Nokopē visu piemēra bloku no šī uzdevuma un ielīmē to norādītajā vietā.
  3. Palaid kodu tieši tādu, kāds tas ir, un pārliecinies, ka parādās rezultāts, izvade vai vismaz nav kļūdas paziņojuma.
  4. Atrodi vienu drošu vietu, ko drīkst mainīt: tekstu, skaitli, krāsu, mainīgā vērtību vai testa ierakstu.
  5. Maini tikai šo vienu vērtību un palaid kodu vēlreiz.
  6. Salīdzini rezultātu pirms un pēc izmaiņas. Ja parādās kļūda, atcel pēdējo izmaiņu un palaid vēlreiz.
  7. Turpini pie 2. uzdevuma tikai tad, kad šis mazais piemērs darbojas.
ienaidnieku_hp = [45, 12, 89, 3, 99, 21, 50, 77, 8, 34]

vajakais = min(ienaidnieku_hp)
stiprakais = max(ienaidnieku_hp)

print(f"Vājākais ienaidnieks: {vajakais} HP")
print(f"Spēcīgākais ienaidnieks: {stiprakais} HP")
Vājākais ienaidnieks: 3 HP
Spēcīgākais ienaidnieks: 99 HP

2. uzdevums: "Ātruma sacīkstes (O(n) pret O(n))"

Pārbaudīsim praksē apgalvojumu, ka iebūvētais "C" kods ir ātrāks par tīru Python kodu, pat ja abiem ir lineāra sarežģītība O(n).

  1. Izvēlies vienu konkrētu projekta vietu: ievadi, aprēķinu, izvēli, ciklu, datu struktūru, funkciju vai rezultāta izvadi.
  2. Nosauc funkcijas un mainīgos pēc to lomas, piemēram, punkti, gajiens, atbilde, rezultats vai parbauda_ievadi().
  3. Uzraksti funkciju vai koda bloku, kas nolasa sākuma datus, tos apstrādā un atgriež vai izvada rezultātu.
  4. Savieno šo kodu ar jau esošo projekta plūsmu, nevis atstāj to atsevišķā demonstrācijā.
  5. Pievieno vienu īsu komentāru pie sarežģītākās darbības.
  6. Pārbaudi, ka iepriekšējais kods joprojām darbojas pēc jaunā fragmenta pievienošanas.
  7. Salabo pirmo atrasto kļūdu pirms paplašini risinājumu.
  8. Veic Git commit ar īsu ziņu par pievienoto funkcionalitāti.
import time

lieli_dati = list(range(5000000))

# 1. Mūsu pašu rakstītais O(n) cikls
sakums_savs = time.time()
lielakais_savs = lieli_dati[0]
for skaitlis in lieli_dati:
    if skaitlis > lielakais_savs:
        lielakais_savs = skaitlis
laiks_savs = time.time() - sakums_savs

# 2. Python iebūvētā O(n) funkcija
sakums_ieb = time.time()
lielakais_ieb = max(lieli_dati)
laiks_ieb = time.time() - sakums_ieb

print(f"Paša rakstīts cikls aizņēma: {laiks_savs:.5f}s")
print(f"Iebūvētā max() funkcija aizņēma: {laiks_ieb:.5f}s")
Paša rakstīts cikls aizņēma: 0.18520s
Iebūvētā max() funkcija aizņēma: 0.04110s

3. uzdevums: "Timsort pret Burbuli"

Ja pie O(n) atšķirība ir mērāma sekundes simtdaļās, kas notiks, ja salīdzināsim mūsu O(n²) Bubble Sort ar Python iebūvēto O(n log n) Timsort algoritmu?

  1. Izveido trīs testa scenārijus: parasta ievade, robežgadījums un kļūdaina vai tukša ievade.
  2. Palaid parasto scenāriju un pārbaudi termināļa izvadi.
  3. Palaid robežgadījumu ar mazāko, lielāko vai tukšāko vērtību, ko šis kods var saņemt.
  4. Palaid kļūdaino scenāriju un pārbaudi, vai programma neavarē.
  5. Izlabo vienu konkrētu problēmu kodā, datos vai ievades pārbaudē.
  6. Pārbaudi labojumu vēlreiz ar visiem trim scenārijiem.
  7. Beigās pieraksti vienu secinājumu: kura koda rinda vai algoritma solis vislabāk palīdzēja saprast tēmu 7.5 Iebūvēto funkciju efektivitāte.

Papildu uzdevums - Pievieno mazu funkciju

Ja pamatdarbs ir pabeigts, paplašini projektu ar vienu nelielu programmētu uzlabojumu.

  1. Izvēlies vienu mazu papildinājumu, kas izmanto to pašu šīs stundas paņēmienu.
  2. Pievieno vienu jaunu mainīgo, funkciju, nosacījumu, ciklu, datu elementu vai rezultāta izvadi.
  3. Savieno papildinājumu ar esošo projekta kodu.
  4. Pārbaudi, ka pamatfunkcija un papildinājums darbojas kopā.
  5. Saglabā izmaiņas ar Git commit tikai pēc veiksmīgas pārbaudes.
⬅ Iepriekšējā stunda Nākamā stunda ➡