Stundas uzdevums: Salīdzini paša rakstītus meklēšanas un kārtošanas algoritmus ar Python iebūvētajām funkcijām un noskaidro, kāpēc profesionāļi ikdienā izmanto Python iebūvētās funkcijas un kā tās pārspēj mūsu rakstīto kodu ātruma sacīkstēs.
SR 2.4.19. (Tu izmanto gatavus algoritmus tipveida uzdevumu risēšanai)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ļā.
min() un max():
sorted() un Timsort:
cd Tema7_Algoritmini iebuvetas_funkcijas.py; code iebuvetas_funkcijas.pyAtradīsim vājāko un spēcīgāko ienaidnieku masīvā ar vienas rindas komandām.
iebuvetas_funkcijas.py izveido sarakstu ienaidnieku_hp ar 10 dažādām skaitliskām vērtībām.min(), lai atrastu mazāko vērtību, un saglabā to mainīgajā vajakais.max(), lai atrastu lielāko vērtību, un saglabā to mainīgajā stiprakais.
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")
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).
time.lieli_dati = list(range(5000000)) (5 miljoni skaitļu).for ciklu, kas atrod lielāko skaitli sarakstā, un nomēri tā izpildes laiku.max(lieli_dati).
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")
Ja pie O(n) atšķirība ir tikai dažas sekundes simtdaļas, kas notiks, ja salīdzināsim mūsu O(n²) Bubble Sort ar Python iebūvēto O(n log n) Timsort?
bubble_sort(saraksts) funkciju no 2. stundas faila. (Izņem no tās `print` komandu, lai nepiesārņotu ekrānu).dati_burbulim = list(range(5000, 0, -1)) un tādu pašu sarakstu dati_timsort.bubble_sort(dati_burbulim).sorted(dati_timsort).
def bubble_sort(saraksts):
elementu_skaits = len(saraksts)
for j in range(elementu_skaits):
for i in range(elementu_skaits - 1):
if saraksts[i] > saraksts[i + 1]:
saraksts[i], saraksts[i + 1] = saraksts[i + 1], saraksts[i]
return saraksts
# Sagatavojam datus (5000 elementi)
dati_burbulim = list(range(5000, 0, -1))
dati_timsort = list(range(5000, 0, -1))
# Mērām Burbuli O(n^2)
sakums = time.time()
bubble_sort(dati_burbulim)
laiks_burbulis = time.time() - sakums
# Mērām Python iebūvēto sorted() O(n log n)
sakums = time.time()
sorted(dati_timsort)
laiks_timsort = time.time() - sakums
print(f"Bubble Sort (5000 el.) laiks: {laiks_burbulis:.5f}s")
print(f"Timsort (sorted) laiks: {laiks_timsort:.5f}s")