Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Maximering av Sorteringseffektivitet | Förbättra Prestanda med Inbyggda Verktyg
Optimeringstekniker i Python

bookMaximering 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:

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

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:

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

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 minnes­effektiv?

question mark

Du behöver sortera en hel lista med tal utan att ändra den ursprungliga listan. Vilken sorteringsfunktion/metod bör du använda?

Select the correct answer

question mark

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 minnes­effektiv?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

bookMaximering 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:

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

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:

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

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 minnes­effektiv?

question mark

Du behöver sortera en hel lista med tal utan att ändra den ursprungliga listan. Vilken sorteringsfunktion/metod bör du använda?

Select the correct answer

question mark

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 minnes­effektiv?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3
some-alt