 Massimizzazione dell'Efficienza dell'Ordinamento
Massimizzazione dell'Efficienza dell'Ordinamento
Ordinamento integrato
Ogni volta che è necessario ordinare una lista, salvo rari casi particolari, è quasi sempre preferibile utilizzare uno dei due strumenti di ordinamento altamente ottimizzati: la funzione sorted() o il metodo sort(). Entrambi sono implementati in C e utilizzano Timsort, un algoritmo ibrido che combina merge sort e insertion sort per garantire efficienza.
sorted() è ideale per l'ordinamento generico quando si desidera ordinare qualsiasi iterabile senza modificare i dati originali. Al contrario, sort() è più adatto alle liste quando è accettabile una modifica in loco.
sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place
Entrambi i metodi sono efficienti, ma list.sort() può risultare solo leggermente più veloce per liste di grandi dimensioni poiché evita la creazione di una nuova lista. Tuttavia, utilizzare sorted() se è necessario mantenere intatta la lista originale.
Ordinamento parziale con heapq
Nei casi in cui servono solo i valori più piccoli o più grandi di un dataset, ordinare l'intero insieme di dati è superfluo. Il modulo heapq offre metodi efficienti come heapq.nsmallest() e heapq.nlargest() per estrarre questi elementi senza ordinare completamente l'iterabile, rendendo il processo più veloce e con un minor consumo di memoria.
Confrontiamo le prestazioni della funzione sorted() e di heapq.nsmallest() per recuperare i 10 numeri più piccoli da una 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)
Come puoi vedere, nel nostro esempio specifico heapq.nsmallest() è circa 10 volte più veloce.
Tuttavia, se il numero di elementi più grandi o più piccoli (n) che si desidera recuperare è vicino al numero totale di elementi nella lista, heapq risulta spesso più lento rispetto all'utilizzo della funzione sorted() o del metodo .sort().
Ad esempio, ora recuperiamo i 100000 elementi più piccoli della 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(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)
In questo caso, la funzione sorted() supera chiaramente heapq in termini di prestazioni.
1. È necessario ordinare un'intera lista di numeri mantenendo intatta la lista originale. Quale funzione/metodo di ordinamento dovresti utilizzare?
2. Stai esaminando un dataset di 500.000 record di vendite. Per identificare le 20 transazioni con il maggior fatturato, quale approccio è probabilmente più veloce e più efficiente in termini di memoria?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
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 Massimizzazione dell'Efficienza dell'Ordinamento
Massimizzazione dell'Efficienza dell'Ordinamento
Scorri per mostrare il menu
Ordinamento integrato
Ogni volta che è necessario ordinare una lista, salvo rari casi particolari, è quasi sempre preferibile utilizzare uno dei due strumenti di ordinamento altamente ottimizzati: la funzione sorted() o il metodo sort(). Entrambi sono implementati in C e utilizzano Timsort, un algoritmo ibrido che combina merge sort e insertion sort per garantire efficienza.
sorted() è ideale per l'ordinamento generico quando si desidera ordinare qualsiasi iterabile senza modificare i dati originali. Al contrario, sort() è più adatto alle liste quando è accettabile una modifica in loco.
sorted_list = sorted(some_list)  # Returns a new sorted list
some_list.sort()  # Sorts the list in place
Entrambi i metodi sono efficienti, ma list.sort() può risultare solo leggermente più veloce per liste di grandi dimensioni poiché evita la creazione di una nuova lista. Tuttavia, utilizzare sorted() se è necessario mantenere intatta la lista originale.
Ordinamento parziale con heapq
Nei casi in cui servono solo i valori più piccoli o più grandi di un dataset, ordinare l'intero insieme di dati è superfluo. Il modulo heapq offre metodi efficienti come heapq.nsmallest() e heapq.nlargest() per estrarre questi elementi senza ordinare completamente l'iterabile, rendendo il processo più veloce e con un minor consumo di memoria.
Confrontiamo le prestazioni della funzione sorted() e di heapq.nsmallest() per recuperare i 10 numeri più piccoli da una 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)
Come puoi vedere, nel nostro esempio specifico heapq.nsmallest() è circa 10 volte più veloce.
Tuttavia, se il numero di elementi più grandi o più piccoli (n) che si desidera recuperare è vicino al numero totale di elementi nella lista, heapq risulta spesso più lento rispetto all'utilizzo della funzione sorted() o del metodo .sort().
Ad esempio, ora recuperiamo i 100000 elementi più piccoli della 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(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)
In questo caso, la funzione sorted() supera chiaramente heapq in termini di prestazioni.
1. È necessario ordinare un'intera lista di numeri mantenendo intatta la lista originale. Quale funzione/metodo di ordinamento dovresti utilizzare?
2. Stai esaminando un dataset di 500.000 record di vendite. Per identificare le 20 transazioni con il maggior fatturato, quale approccio è probabilmente più veloce e più efficiente in termini di memoria?
Grazie per i tuoi commenti!