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
Fantastico!
Completion tasso migliorato a 7.69
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!