Liste e Array NumPy
La scelta della struttura dati appropriata può influire notevolmente sia sulla velocità che sull'utilizzo della memoria. Esaminiamo innanzitutto le liste e confrontiamole con gli array di NumPy per comprendere quando e come utilizzare efficacemente queste strutture dati.
Lista
Una list è uno dei tipi di dati più comunemente utilizzati. Funziona come un array dinamico, il che significa che la sua dimensione può aumentare o diminuire secondo necessità. Le liste sono versatili e offrono accesso e modifica efficienti a indici arbitrari. Tuttavia, operazioni come l'inserimento o la rimozione di elementi e la ricerca di un elemento (verifica della presenza) possono diventare lente per liste di grandi dimensioni. L'eccezione è rappresentata dall'inserimento o rimozione alla fine della lista, che rimane efficiente indipendentemente dalla dimensione della lista.
L'utilizzo delle liste è consigliato nei seguenti scenari:
- Necessità di dati ordinati;
- Accesso o modifica frequente degli elementi tramite indice;
- Necessità di memorizzare tipi di dati diversi (ad esempio, interi, stringhe o oggetti personalizzati);
- Non è richiesta una verifica rapida della presenza o un'inserimento/rimozione veloce nel mezzo della lista.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Array NumPy
Sebbene le liste siano versatili, non sono le più efficienti per operazioni numeriche su larga scala. In questi casi entrano in gioco gli array NumPy.
Gli array NumPy sono implementati in C, il che li rende molto più veloci delle liste per le operazioni numeriche. Un fattore chiave è la vettorizzazione, che consente di eseguire operazioni su interi array contemporaneamente, senza la necessità di cicli espliciti. Questo porta a notevoli miglioramenti delle prestazioni, soprattutto con grandi insiemi di dati.
Vediamo un esempio di elevamento al quadrato di ciascun elemento in una lista (utilizzando un ciclo for all'interno di una list comprehension) e in un array NumPy (utilizzando la vettorizzazione):
1234567891011121314151617181920import numpy as np import os 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 my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Come puoi vedere, il vantaggio in termini di prestazioni degli array NumPy è piuttosto evidente.
Quando si lavora con dati numerici, gli array NumPy offrono un vantaggio in termini di memoria rispetto alle liste. Memorizzano i dati effettivi in blocchi di memoria contigui, risultando più efficienti, soprattutto per grandi insiemi di dati. Essendo omogenei (stesso tipo di dato), gli array NumPy evitano il sovraccarico dovuto ai riferimenti agli oggetti.
Al contrario, le liste sono eterogenee, memorizzando riferimenti a oggetti in memoria contigua, mentre gli oggetti reali sono archiviati altrove. Questa flessibilità introduce un ulteriore sovraccarico di memoria quando si lavora con dati numerici.
In sintesi, la seguente tabella confronta le liste con gli array NumPy:
1. Si sta sviluppando un programma per gestire una collezione di oggetti Sensor (classe personalizzata), ciascuno contenente un timestamp (stringa) e una reading (float). Il dataset crescerà nel tempo e saranno richiesti aggiornamenti frequenti alle singole letture dei sensori. Quale struttura dati sarebbe la scelta migliore?
2. Si sta lavorando con un ampio dataset numerico per un progetto di machine learning. Quale struttura dati fornirebbe le prestazioni più efficienti per questo compito?
3. Si stanno analizzando dati di mercato azionario, costituiti da valori numerici (prezzi) nel tempo. È necessario eseguire calcoli rapidi, come trovare il prezzo medio e applicare trasformazioni matematiche sui dati. Quale struttura dati si dovrebbe scegliere?
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 more about when to use lists versus NumPy arrays?
What are some common mistakes when choosing between lists and NumPy arrays?
Can you give more examples of operations that are faster with NumPy arrays?
Awesome!
Completion rate improved to 7.69
Liste e Array NumPy
Scorri per mostrare il menu
La scelta della struttura dati appropriata può influire notevolmente sia sulla velocità che sull'utilizzo della memoria. Esaminiamo innanzitutto le liste e confrontiamole con gli array di NumPy per comprendere quando e come utilizzare efficacemente queste strutture dati.
Lista
Una list è uno dei tipi di dati più comunemente utilizzati. Funziona come un array dinamico, il che significa che la sua dimensione può aumentare o diminuire secondo necessità. Le liste sono versatili e offrono accesso e modifica efficienti a indici arbitrari. Tuttavia, operazioni come l'inserimento o la rimozione di elementi e la ricerca di un elemento (verifica della presenza) possono diventare lente per liste di grandi dimensioni. L'eccezione è rappresentata dall'inserimento o rimozione alla fine della lista, che rimane efficiente indipendentemente dalla dimensione della lista.
L'utilizzo delle liste è consigliato nei seguenti scenari:
- Necessità di dati ordinati;
- Accesso o modifica frequente degli elementi tramite indice;
- Necessità di memorizzare tipi di dati diversi (ad esempio, interi, stringhe o oggetti personalizzati);
- Non è richiesta una verifica rapida della presenza o un'inserimento/rimozione veloce nel mezzo della lista.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Array NumPy
Sebbene le liste siano versatili, non sono le più efficienti per operazioni numeriche su larga scala. In questi casi entrano in gioco gli array NumPy.
Gli array NumPy sono implementati in C, il che li rende molto più veloci delle liste per le operazioni numeriche. Un fattore chiave è la vettorizzazione, che consente di eseguire operazioni su interi array contemporaneamente, senza la necessità di cicli espliciti. Questo porta a notevoli miglioramenti delle prestazioni, soprattutto con grandi insiemi di dati.
Vediamo un esempio di elevamento al quadrato di ciascun elemento in una lista (utilizzando un ciclo for all'interno di una list comprehension) e in un array NumPy (utilizzando la vettorizzazione):
1234567891011121314151617181920import numpy as np import os 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 my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Come puoi vedere, il vantaggio in termini di prestazioni degli array NumPy è piuttosto evidente.
Quando si lavora con dati numerici, gli array NumPy offrono un vantaggio in termini di memoria rispetto alle liste. Memorizzano i dati effettivi in blocchi di memoria contigui, risultando più efficienti, soprattutto per grandi insiemi di dati. Essendo omogenei (stesso tipo di dato), gli array NumPy evitano il sovraccarico dovuto ai riferimenti agli oggetti.
Al contrario, le liste sono eterogenee, memorizzando riferimenti a oggetti in memoria contigua, mentre gli oggetti reali sono archiviati altrove. Questa flessibilità introduce un ulteriore sovraccarico di memoria quando si lavora con dati numerici.
In sintesi, la seguente tabella confronta le liste con gli array NumPy:
1. Si sta sviluppando un programma per gestire una collezione di oggetti Sensor (classe personalizzata), ciascuno contenente un timestamp (stringa) e una reading (float). Il dataset crescerà nel tempo e saranno richiesti aggiornamenti frequenti alle singole letture dei sensori. Quale struttura dati sarebbe la scelta migliore?
2. Si sta lavorando con un ampio dataset numerico per un progetto di machine learning. Quale struttura dati fornirebbe le prestazioni più efficienti per questo compito?
3. Si stanno analizzando dati di mercato azionario, costituiti da valori numerici (prezzi) nel tempo. È necessario eseguire calcoli rapidi, come trovare il prezzo medio e applicare trasformazioni matematiche sui dati. Quale struttura dati si dovrebbe scegliere?
Grazie per i tuoi commenti!