Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Lajittelun Tehokkuuden Maksimointi | Suorituskyvyn Parantaminen Sisäänrakennetuilla Työkaluilla
Optimointitekniikat Pythonissa

bookLajittelun Tehokkuuden Maksimointi

Sisäänrakennettu lajittelu

Aina kun tarvitset listan lajittelua, lukuun ottamatta harvinaisia erityistapauksia, on lähes aina parasta käyttää jompaakumpaa kahdesta erittäin optimoidusta lajittelutyökalusta: sorted()-funktiota tai sort()-metodia. Molemmat on toteutettu C-kielellä ja hyödyntävät Timsort-algoritmia, joka yhdistää sulautuslajittelun ja lisäyslajittelun tehokkuuden saavuttamiseksi.

sorted() soveltuu yleiskäyttöiseen lajitteluun, kun haluat lajitella minkä tahansa iteroitavan muuttamatta alkuperäistä dataa. Toisaalta sort() sopii parhaiten listoille, kun paikallinen muokkaus on hyväksyttävää.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Molemmat menetelmät ovat tehokkaita, mutta list.sort() voi olla hieman nopeampi erittäin suurilla listoilla, koska se ei luo uutta listaa. Käytä kuitenkin sorted()-funktiota, jos haluat säilyttää alkuperäisen listan muuttumattomana.

Osittainen lajittelu heapq-moduulilla

Jos tarvitset vain pienimmät tai suurimmat alkiot tietojoukosta, koko datan lajittelu on tarpeetonta. heapq-moduuli tarjoaa tehokkaita menetelmiä, kuten heapq.nsmallest() ja heapq.nlargest(), joiden avulla voit poimia nämä alkiot ilman koko iteroitavan täydellistä lajittelua, mikä tekee siitä nopeamman ja muistitehokkaamman.

Vertailkaamme sorted()-funktion ja heapq.nsmallest()-funktion suorituskykyä, kun haetaan listasta 10 pienintä lukua:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

Kuten huomaat, tässä esimerkissä heapq.nsmallest() on noin 10 kertaa nopeampi.

Jos kuitenkin haettavien suurimpien tai pienimpien alkioiden määrä (n) on lähellä listan kokonaismäärää, heapq on usein hitaampi kuin sorted()-funktio tai .sort()-metodi.

Esimerkiksi haetaan nyt listan 100000 pienintä alkiota:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

sorted()-funktio on tässä tapauksessa selvästi nopeampi kuin heapq.

1. Sinun täytyy lajitella kokonainen numerosarja säilyttäen alkuperäisen listan muuttumattomana. Mitä lajittelufunktiota/metodia tulisi käyttää?

2. Arvioit 500 000 myyntitapahtuman tietojoukkoa. Mikä lähestymistapa on todennäköisesti nopein ja muistitehokkain tunnistettaessa 20 eniten liikevaihtoa tuottavaa tapahtumaa?

question mark

Sinun täytyy lajitella kokonainen numerosarja säilyttäen alkuperäisen listan muuttumattomana. Mitä lajittelufunktiota/metodia tulisi käyttää?

Select the correct answer

question mark

Arvioit 500 000 myyntitapahtuman tietojoukkoa. Mikä lähestymistapa on todennäköisesti nopein ja muistitehokkain tunnistettaessa 20 eniten liikevaihtoa tuottavaa tapahtumaa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you explain why heapq is faster for small n but slower for large n?

When should I use heapq over sorted() in practice?

Are there other efficient ways to partially sort data in Python?

Awesome!

Completion rate improved to 7.69

bookLajittelun Tehokkuuden Maksimointi

Pyyhkäise näyttääksesi valikon

Sisäänrakennettu lajittelu

Aina kun tarvitset listan lajittelua, lukuun ottamatta harvinaisia erityistapauksia, on lähes aina parasta käyttää jompaakumpaa kahdesta erittäin optimoidusta lajittelutyökalusta: sorted()-funktiota tai sort()-metodia. Molemmat on toteutettu C-kielellä ja hyödyntävät Timsort-algoritmia, joka yhdistää sulautuslajittelun ja lisäyslajittelun tehokkuuden saavuttamiseksi.

sorted() soveltuu yleiskäyttöiseen lajitteluun, kun haluat lajitella minkä tahansa iteroitavan muuttamatta alkuperäistä dataa. Toisaalta sort() sopii parhaiten listoille, kun paikallinen muokkaus on hyväksyttävää.

sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place

Molemmat menetelmät ovat tehokkaita, mutta list.sort() voi olla hieman nopeampi erittäin suurilla listoilla, koska se ei luo uutta listaa. Käytä kuitenkin sorted()-funktiota, jos haluat säilyttää alkuperäisen listan muuttumattomana.

Osittainen lajittelu heapq-moduulilla

Jos tarvitset vain pienimmät tai suurimmat alkiot tietojoukosta, koko datan lajittelu on tarpeetonta. heapq-moduuli tarjoaa tehokkaita menetelmiä, kuten heapq.nsmallest() ja heapq.nlargest(), joiden avulla voit poimia nämä alkiot ilman koko iteroitavan täydellistä lajittelua, mikä tekee siitä nopeamman ja muistitehokkaamman.

Vertailkaamme sorted()-funktion ja heapq.nsmallest()-funktion suorituskykyä, kun haetaan listasta 10 pienintä lukua:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(10, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:10] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

Kuten huomaat, tässä esimerkissä heapq.nsmallest() on noin 10 kertaa nopeampi.

Jos kuitenkin haettavien suurimpien tai pienimpien alkioiden määrä (n) on lähellä listan kokonaismäärää, heapq on usein hitaampi kuin sorted()-funktio tai .sort()-metodi.

Esimerkiksi haetaan nyt listan 100000 pienintä alkiota:

1234567891011121314151617181920212223
import heapq import os decorators = os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator import random # Generate a large list of random integers numbers = [random.randint(1, 1000000) for _ in range(1000000)] @timeit_decorator(number=10) def partial_sort_heapq(): return heapq.nsmallest(100000, numbers) @timeit_decorator(number=10) def partial_sort_sorted(): return sorted(numbers)[:100000] # Compare performance heapq_result = partial_sort_heapq() sorted_result = partial_sort_sorted() # Ensure both methods give the same result print(heapq_result == sorted_result)
copy

sorted()-funktio on tässä tapauksessa selvästi nopeampi kuin heapq.

1. Sinun täytyy lajitella kokonainen numerosarja säilyttäen alkuperäisen listan muuttumattomana. Mitä lajittelufunktiota/metodia tulisi käyttää?

2. Arvioit 500 000 myyntitapahtuman tietojoukkoa. Mikä lähestymistapa on todennäköisesti nopein ja muistitehokkain tunnistettaessa 20 eniten liikevaihtoa tuottavaa tapahtumaa?

question mark

Sinun täytyy lajitella kokonainen numerosarja säilyttäen alkuperäisen listan muuttumattomana. Mitä lajittelufunktiota/metodia tulisi käyttää?

Select the correct answer

question mark

Arvioit 500 000 myyntitapahtuman tietojoukkoa. Mikä lähestymistapa on todennäköisesti nopein ja muistitehokkain tunnistettaessa 20 eniten liikevaihtoa tuottavaa tapahtumaa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 3
some-alt