Maksimering av Sorteringseffektivitet
Innebygd sortering
Når du trenger å sortere en liste, er det nesten alltid best å bruke ett av de to svært optimaliserte sorteringsverktøyene: funksjonen sorted() eller metoden sort(), med unntak av noen sjeldne spesialtilfeller. Begge er implementert i C og benytter Timsort, en hybridalgoritme som kombinerer flette- og innsettingssortering for effektivitet.
sorted() er ideell for generell sortering når du trenger å sortere en hvilken som helst itererbar uten å endre de opprinnelige dataene. På den annen side passer sort() best for lister når modifisering på stedet er akseptabelt.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Begge metodene er effektive, men list.sort() kan være litt raskere for svært store lister siden den unngår å opprette en ny liste. Bruk likevel sorted() hvis du må beholde den opprinnelige listen uendret.
Delvis sortering med heapq
I tilfeller der du kun trenger de minste eller største elementene i et datasett, er det unødvendig å sortere alle dataene. Modulen heapq tilbyr effektive metoder som heapq.nsmallest() og heapq.nlargest() for å hente ut disse elementene uten å sortere hele den itererbare, noe som gjør det raskere og mer minneeffektivt.
La oss sammenligne ytelsen til funksjonen sorted() og funksjonen heapq.nsmallest() for å hente ut de 10 minste tallene fra en liste:
1234567891011121314151617181920212223import 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)
Som du kan se, er heapq.nsmallest() i vårt spesifikke eksempel omtrent 10 ganger raskere.
Men hvis antallet største eller minste elementer (n) du ønsker å hente ut er nær det totale antallet elementer i listen, er heapq ofte tregere enn å bruke funksjonen sorted() eller metoden .sort().
For eksempel, la oss nå hente ut de 100000 minste elementene i listen:
1234567891011121314151617181920212223import 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)
Funksjonen sorted() overgår tydelig heapq i dette tilfellet.
1. Du må sortere en hel liste med tall uten å endre den opprinnelige listen. Hvilken sorteringsfunksjon/-metode bør du bruke?
2. Du gjennomgår et datasett med 500 000 salgsoppføringer. For å identifisere de 20 transaksjonene med høyest inntekt, hvilken tilnærming er sannsynligvis raskest og mest minneeffektiv?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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 av Sorteringseffektivitet
Sveip for å vise menyen
Innebygd sortering
Når du trenger å sortere en liste, er det nesten alltid best å bruke ett av de to svært optimaliserte sorteringsverktøyene: funksjonen sorted() eller metoden sort(), med unntak av noen sjeldne spesialtilfeller. Begge er implementert i C og benytter Timsort, en hybridalgoritme som kombinerer flette- og innsettingssortering for effektivitet.
sorted() er ideell for generell sortering når du trenger å sortere en hvilken som helst itererbar uten å endre de opprinnelige dataene. På den annen side passer sort() best for lister når modifisering på stedet er akseptabelt.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Begge metodene er effektive, men list.sort() kan være litt raskere for svært store lister siden den unngår å opprette en ny liste. Bruk likevel sorted() hvis du må beholde den opprinnelige listen uendret.
Delvis sortering med heapq
I tilfeller der du kun trenger de minste eller største elementene i et datasett, er det unødvendig å sortere alle dataene. Modulen heapq tilbyr effektive metoder som heapq.nsmallest() og heapq.nlargest() for å hente ut disse elementene uten å sortere hele den itererbare, noe som gjør det raskere og mer minneeffektivt.
La oss sammenligne ytelsen til funksjonen sorted() og funksjonen heapq.nsmallest() for å hente ut de 10 minste tallene fra en liste:
1234567891011121314151617181920212223import 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)
Som du kan se, er heapq.nsmallest() i vårt spesifikke eksempel omtrent 10 ganger raskere.
Men hvis antallet største eller minste elementer (n) du ønsker å hente ut er nær det totale antallet elementer i listen, er heapq ofte tregere enn å bruke funksjonen sorted() eller metoden .sort().
For eksempel, la oss nå hente ut de 100000 minste elementene i listen:
1234567891011121314151617181920212223import 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)
Funksjonen sorted() overgår tydelig heapq i dette tilfellet.
1. Du må sortere en hel liste med tall uten å endre den opprinnelige listen. Hvilken sorteringsfunksjon/-metode bør du bruke?
2. Du gjennomgår et datasett med 500 000 salgsoppføringer. For å identifisere de 20 transaksjonene med høyest inntekt, hvilken tilnærming er sannsynligvis raskest og mest minneeffektiv?
Takk for tilbakemeldingene dine!