Maksimering af Sorteringseffektivitet
Indbyggede sorteringsmetoder
Når du skal sortere en liste, er det næsten altid bedst at anvende en af de to højt optimerede sorteringsværktøjer: funktionen sorted() eller metoden sort(). Begge er implementeret i C og benytter Timsort, en hybridalgoritme der kombinerer mergesort og insertionssort for effektivitet.
sorted() er velegnet til generel sortering, når du skal sortere et hvilket som helst iterabelt objekt uden at ændre de oprindelige data. Omvendt er sort() bedst egnet til lister, hvor ændring af listen direkte er acceptabelt.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Begge metoder er effektive, men list.sort() kan være en smule hurtigere for meget store lister, da den undgår at oprette en ny liste. Brug dog sorted() hvis du skal bevare den oprindelige liste uændret.
Delvis sortering med heapq
Hvis du kun har brug for de mindste eller største elementer i et datasæt, er det unødvendigt at sortere hele datasættet. Modulet heapq tilbyder effektive metoder som heapq.nsmallest() og heapq.nlargest() til at udtrække disse elementer uden at sortere hele det itererbare objekt, hvilket gør det hurtigere og mere hukommelseseffektivt.
Her sammenlignes ydeevnen for funktionen sorted() og funktionen heapq.nsmallest() til at hente de 10 mindste tal fra en liste:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://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)
Som du kan se, er heapq.nsmallest() i vores specifikke eksempel cirka 10 gange hurtigere.
Dog, hvis antallet af største eller mindste elementer (n), du ønsker at hente, er tæt på det samlede antal elementer i listen, er heapq ofte langsommere end at bruge funktionen sorted() eller metoden .sort().
For eksempel, lad os nu hente de 100000 mindste elementer fra listen:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://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)
Funktionen sorted() overgår tydeligt heapq i dette tilfælde.
1. Du skal sortere en hel liste af tal uden at ændre den oprindelige liste. Hvilken sorteringsfunktion/-metode bør du anvende?
2. Du gennemgår et datasæt med 500.000 salgsregistreringer. For at identificere de 20 transaktioner med højest omsætning, hvilken tilgang er sandsynligvis hurtigst og mest hukommelseseffektiv?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Maksimering af Sorteringseffektivitet
Stryg for at vise menuen
Indbyggede sorteringsmetoder
Når du skal sortere en liste, er det næsten altid bedst at anvende en af de to højt optimerede sorteringsværktøjer: funktionen sorted() eller metoden sort(). Begge er implementeret i C og benytter Timsort, en hybridalgoritme der kombinerer mergesort og insertionssort for effektivitet.
sorted() er velegnet til generel sortering, når du skal sortere et hvilket som helst iterabelt objekt uden at ændre de oprindelige data. Omvendt er sort() bedst egnet til lister, hvor ændring af listen direkte er acceptabelt.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Begge metoder er effektive, men list.sort() kan være en smule hurtigere for meget store lister, da den undgår at oprette en ny liste. Brug dog sorted() hvis du skal bevare den oprindelige liste uændret.
Delvis sortering med heapq
Hvis du kun har brug for de mindste eller største elementer i et datasæt, er det unødvendigt at sortere hele datasættet. Modulet heapq tilbyder effektive metoder som heapq.nsmallest() og heapq.nlargest() til at udtrække disse elementer uden at sortere hele det itererbare objekt, hvilket gør det hurtigere og mere hukommelseseffektivt.
Her sammenlignes ydeevnen for funktionen sorted() og funktionen heapq.nsmallest() til at hente de 10 mindste tal fra en liste:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://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)
Som du kan se, er heapq.nsmallest() i vores specifikke eksempel cirka 10 gange hurtigere.
Dog, hvis antallet af største eller mindste elementer (n), du ønsker at hente, er tæt på det samlede antal elementer i listen, er heapq ofte langsommere end at bruge funktionen sorted() eller metoden .sort().
For eksempel, lad os nu hente de 100000 mindste elementer fra listen:
1234567891011121314151617181920212223import heapq import os decorators = os.system('wget https://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)
Funktionen sorted() overgår tydeligt heapq i dette tilfælde.
1. Du skal sortere en hel liste af tal uden at ændre den oprindelige liste. Hvilken sorteringsfunktion/-metode bør du anvende?
2. Du gennemgår et datasæt med 500.000 salgsregistreringer. For at identificere de 20 transaktioner med højest omsætning, hvilken tilgang er sandsynligvis hurtigst og mest hukommelseseffektiv?
Tak for dine kommentarer!