 Maximering av Sorteringseffektivitet
Maximering av Sorteringseffektivitet
Inbyggd sortering
När du behöver sortera en lista är det, förutom i några sällsynta specialfall, nästan alltid bäst att använda ett av dess två högt optimerade sorteringsverktyg: funktionen sorted() eller metoden sort(). Båda är implementerade i C och använder Timsort, en hybridalgoritm som kombinerar mergesort och insertionssortering för effektivitet.
sorted() är idealisk för allmän sortering när du behöver sortera en iterable utan att ändra originaldatan. Å andra sidan passar sort() bäst för listor när modifiering på plats är acceptabelt.
sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place
Båda metoderna är effektiva, men list.sort() kan vara något snabbare för mycket stora listor eftersom den undviker att skapa en ny lista. Använd dock sorted() om du behöver behålla originallistan oförändrad.
Partiell sortering med heapq
För situationer där du bara behöver de minsta eller största elementen i en datamängd är det onödigt att sortera hela datan. Modulen heapq tillhandahåller effektiva metoder som heapq.nsmallest() och heapq.nlargest() för att extrahera dessa element utan att helt sortera iterable-objektet, vilket gör det snabbare och mer minneseffektivt.
Låt oss jämföra prestandan mellan funktionen sorted() och funktionen heapq.nsmallest() för att hämta de 10 minsta talen från en lista:
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, i vårt specifika exempel är heapq.nsmallest() ungefär 10 gånger snabbare.
Men om antalet största eller minsta element (n) du vill hämta är nära det totala antalet element i listan, är heapq ofta långsammare än att använda funktionen sorted() eller metoden .sort().
Till exempel, låt oss nu hämta de 100000 minsta elementen i listan:
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)
Funktionen sorted() överträffar i detta fall tydligt heapq.
1. Du behöver sortera en hel lista med tal utan att ändra den ursprungliga listan. Vilken sorteringsfunktion/metod bör du använda?
2. Du granskar en datamängd med 500 000 försäljningsposter. För att identifiera de 20 transaktioner med högst intäkter, vilken metod är troligtvis snabbast och mest minneseffektiv?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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 Maximering av Sorteringseffektivitet
Maximering av Sorteringseffektivitet
Svep för att visa menyn
Inbyggd sortering
När du behöver sortera en lista är det, förutom i några sällsynta specialfall, nästan alltid bäst att använda ett av dess två högt optimerade sorteringsverktyg: funktionen sorted() eller metoden sort(). Båda är implementerade i C och använder Timsort, en hybridalgoritm som kombinerar mergesort och insertionssortering för effektivitet.
sorted() är idealisk för allmän sortering när du behöver sortera en iterable utan att ändra originaldatan. Å andra sidan passar sort() bäst för listor när modifiering på plats är acceptabelt.
sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place
Båda metoderna är effektiva, men list.sort() kan vara något snabbare för mycket stora listor eftersom den undviker att skapa en ny lista. Använd dock sorted() om du behöver behålla originallistan oförändrad.
Partiell sortering med heapq
För situationer där du bara behöver de minsta eller största elementen i en datamängd är det onödigt att sortera hela datan. Modulen heapq tillhandahåller effektiva metoder som heapq.nsmallest() och heapq.nlargest() för att extrahera dessa element utan att helt sortera iterable-objektet, vilket gör det snabbare och mer minneseffektivt.
Låt oss jämföra prestandan mellan funktionen sorted() och funktionen heapq.nsmallest() för att hämta de 10 minsta talen från en lista:
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, i vårt specifika exempel är heapq.nsmallest() ungefär 10 gånger snabbare.
Men om antalet största eller minsta element (n) du vill hämta är nära det totala antalet element i listan, är heapq ofta långsammare än att använda funktionen sorted() eller metoden .sort().
Till exempel, låt oss nu hämta de 100000 minsta elementen i listan:
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)
Funktionen sorted() överträffar i detta fall tydligt heapq.
1. Du behöver sortera en hel lista med tal utan att ändra den ursprungliga listan. Vilken sorteringsfunktion/metod bör du använda?
2. Du granskar en datamängd med 500 000 försäljningsposter. För att identifiera de 20 transaktioner med högst intäkter, vilken metod är troligtvis snabbast och mest minneseffektiv?
Tack för dina kommentarer!