Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Massimizzazione dell'Efficienza dell'Ordinamento | Ottimizzazione delle Prestazioni con Strumenti Integrati
Tecniche di Ottimizzazione in Python

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

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

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:

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

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?

question mark

È necessario ordinare un'intera lista di numeri mantenendo intatta la lista originale. Quale funzione/metodo di ordinamento dovresti utilizzare?

Select the correct answer

question mark

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?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

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

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

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

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:

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

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?

question mark

È necessario ordinare un'intera lista di numeri mantenendo intatta la lista originale. Quale funzione/metodo di ordinamento dovresti utilizzare?

Select the correct answer

question mark

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?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3
some-alt