Het Maximaliseren van Sorteerefficiëntie
Ingebouwde Sortering
Wanneer je een lijst moet sorteren, behalve in enkele zeldzame speciale gevallen, is het bijna altijd het beste om een van de twee sterk geoptimaliseerde sorteertools te gebruiken: de sorted() functie of de sort() methode. Beide zijn geïmplementeerd in C en gebruiken Timsort, een hybride algoritme dat merge sort en insertion sort combineert voor efficiëntie.
sorted() is ideaal voor algemeen sorteren wanneer je een willekeurige iterable wilt sorteren zonder de originele data te wijzigen. Aan de andere kant is sort() het meest geschikt voor lijsten wanneer wijziging ter plaatse acceptabel is.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Beide methoden zijn efficiënt, maar list.sort() kan iets sneller zijn voor zeer grote lijsten omdat het geen nieuwe lijst aanmaakt. Gebruik echter sorted() als je de originele lijst intact wilt houden.
Gedeeltelijk Sorteren met heapq
Voor gevallen waarin je alleen de kleinste of grootste elementen van een dataset nodig hebt, is het sorteren van de volledige data niet nodig. De heapq module biedt efficiënte methoden zoals heapq.nsmallest() en heapq.nlargest() om deze elementen te extraheren zonder de gehele iterable te sorteren, wat het sneller en geheugen-efficiënter maakt.
Laten we de prestaties vergelijken van de sorted() functie en de heapq.nsmallest() functie voor het ophalen van de 10 kleinste getallen uit een lijst:
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)
Zoals te zien is in ons specifieke voorbeeld, is heapq.nsmallest() ongeveer 10 keer sneller.
Echter, als het aantal grootste of kleinste elementen (n) dat je wilt ophalen dicht bij het totale aantal elementen in de lijst ligt, is heapq vaak langzamer dan het gebruik van de sorted()-functie of de .sort()-methode.
Laten we bijvoorbeeld nu 100000 kleinste elementen uit de lijst ophalen:
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)
De sorted()-functie presteert in dit geval duidelijk beter dan heapq.
1. Je moet een volledige lijst met getallen sorteren terwijl je de oorspronkelijke lijst intact houdt. Welke sorteermethode/functie moet je gebruiken?
2. Je beoordeelt een dataset van 500.000 verkooprecords. Om de 20 transacties met de hoogste omzet te identificeren, welke aanpak is waarschijnlijk sneller en efficiënter qua geheugen?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Geweldig!
Completion tarief verbeterd naar 7.69
Het Maximaliseren van Sorteerefficiëntie
Veeg om het menu te tonen
Ingebouwde Sortering
Wanneer je een lijst moet sorteren, behalve in enkele zeldzame speciale gevallen, is het bijna altijd het beste om een van de twee sterk geoptimaliseerde sorteertools te gebruiken: de sorted() functie of de sort() methode. Beide zijn geïmplementeerd in C en gebruiken Timsort, een hybride algoritme dat merge sort en insertion sort combineert voor efficiëntie.
sorted() is ideaal voor algemeen sorteren wanneer je een willekeurige iterable wilt sorteren zonder de originele data te wijzigen. Aan de andere kant is sort() het meest geschikt voor lijsten wanneer wijziging ter plaatse acceptabel is.
sorted_list = sorted(some_list) # Returns a new sorted list
some_list.sort() # Sorts the list in place
Beide methoden zijn efficiënt, maar list.sort() kan iets sneller zijn voor zeer grote lijsten omdat het geen nieuwe lijst aanmaakt. Gebruik echter sorted() als je de originele lijst intact wilt houden.
Gedeeltelijk Sorteren met heapq
Voor gevallen waarin je alleen de kleinste of grootste elementen van een dataset nodig hebt, is het sorteren van de volledige data niet nodig. De heapq module biedt efficiënte methoden zoals heapq.nsmallest() en heapq.nlargest() om deze elementen te extraheren zonder de gehele iterable te sorteren, wat het sneller en geheugen-efficiënter maakt.
Laten we de prestaties vergelijken van de sorted() functie en de heapq.nsmallest() functie voor het ophalen van de 10 kleinste getallen uit een lijst:
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)
Zoals te zien is in ons specifieke voorbeeld, is heapq.nsmallest() ongeveer 10 keer sneller.
Echter, als het aantal grootste of kleinste elementen (n) dat je wilt ophalen dicht bij het totale aantal elementen in de lijst ligt, is heapq vaak langzamer dan het gebruik van de sorted()-functie of de .sort()-methode.
Laten we bijvoorbeeld nu 100000 kleinste elementen uit de lijst ophalen:
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)
De sorted()-functie presteert in dit geval duidelijk beter dan heapq.
1. Je moet een volledige lijst met getallen sorteren terwijl je de oorspronkelijke lijst intact houdt. Welke sorteermethode/functie moet je gebruiken?
2. Je beoordeelt een dataset van 500.000 verkooprecords. Om de 20 transacties met de hoogste omzet te identificeren, welke aanpak is waarschijnlijk sneller en efficiënter qua geheugen?
Bedankt voor je feedback!