Spiegazione degli array in Python!

Jan 23 2023
Se stai iniziando a programmare o stai imparando a conoscere Python, questo articolo è per te, gli array sono una delle strutture di dati più utilizzate. In che modo Python rappresenta gli array? Come possiamo manipolare gli array in Python per risolvere diversi problemi? Questo è ciò che scopriremo in questo articolo.
Immagine della schermata di codifica

Se stai iniziando a programmare o stai imparando a conoscere Python, questo articolo è per te, gli array sono una delle strutture di dati più utilizzate. In che modo Python rappresenta gli array? Come possiamo manipolare gli array in Python per risolvere diversi problemi? Questo è ciò che scopriremo in questo articolo.

In che modo i computer memorizzano le informazioni?

Come sai, la forma più primaria di informazioni in un computer è composta da bit di informazioni. 8 bit di queste informazioni vengono quindi raggruppati per formare quello che chiamiamo byte .

Poiché i computer possono memorizzare porzioni molto grandi di questi byte, hanno bisogno di un nuovo meccanismo che consenta loro di leggere e scrivere rapidamente byte, è qui che entrano in gioco gli indirizzi di memoria , proprio come il tuo indirizzo di casa personale differenzia dove vivi dal tuo vicino, il il computer utilizza gli indirizzi di memoria per differenziare dove risiedono i diversi pezzi di dati e informazioni.

Vale anche la pena ricordare che il computer impiega il tempo di accesso O(1) per raggiungere qualsiasi indirizzo di memoria, ciò significa che accedere al byte #5489637 equivale ad accedere al byte #64.

Cosa sono gli array?

Una pratica comune nei linguaggi di programmazione consiste nell'utilizzare le variabili per fare riferimento a un indirizzo in una memoria, ad esempio l'identificatore X può fare riferimento al byte #32.

Nel caso in cui vogliamo memorizzare più indirizzi di memoria la creazione di più identificatori non è efficiente e scalabile. Preferiremmo di più se avessimo un nome per il gruppo di identificatori e utilizzassimo i numeri per accedere a identificatori specifici. Tale rappresentazione è un array, in altre parole è una rappresentazione di un gruppo di variabili in una porzione contigua della memoria del computer.

Le stringhe in Python, ad esempio, sono memorizzate in questo modo, diciamo che dichiari una nuova variabile con il testo 'example' che Python allocherà:

2 byte (memoria necessaria per memorizzare un carattere Unicode) * 7 (numero di caratteri nella parola esempio) = 14 byte di memoria contigua per memorizzare questa variabile.

Matrici referenziali

Python usa un altro tipo di array che sono array referenziali, per capirli diamo un'occhiata a questo esempio, diciamo che possiedi un hotel e hai 50 stanze, hai bisogno di un modo per memorizzare il nome di chi sta in quale stanza così una rappresentazione come la seguente:

Elenco dei nomi

per fare questo Python deve rispettare la condizione di spazio di memoria contiguo da allocare. Ma come si fa quando i nomi hanno lunghezze diverse (lunghezze diverse significano requisiti di spazio diversi)?

Una soluzione sarebbe trovare la lunghezza della stringa più grande e allocare spazio di memoria sufficiente per tutti, ma questo non sarà efficiente in termini di memoria poiché parte dello spazio verrà sprecato e cosa succede se arriva una nuova stringa che ora è la stringa più grande?

Per risolvere questo problema, Python crea un array di riferimenti contigui a più oggetti, quindi ora, anche se la dimensione di ogni singolo oggetto può variare, la memoria utilizzata per memorizzare il suo indirizzo di memoria è la stessa. In questo modo Python garantisce un tempo di accesso costante ai diversi elementi dell'array. Ci riferiamo a questo tipo di array come array referenziale.

Per illustrare questo, dai un'occhiata a questa immagine:

Illustrazione di un array referenziale

Liste e tuple in Python usano questo tipo di array per memorizzare i dati.

Nota: poiché gli array referenziali puntano a riferimenti, fai attenzione quando cambi i valori di riferimento poiché puoi anche modificare i valori negli elenchi per errore. Inoltre, durante la creazione di copie, assicurati di conoscere la differenza tra Shallow e Deep copy .

Array compatti

In precedenza abbiamo parlato delle stringhe e di come le memorizziamo in un array di memoria contigua, infatti chiamiamo questo array un array compatto.

Un vantaggio dell'utilizzo di array compatti rispetto a quelli referenziali non è un sovraccarico aggiuntivo derivante dall'archiviazione dei riferimenti di memoria, memorizziamo direttamente i dati primari. Un altro vantaggio degno di nota è che in caso di utilizzo di un elenco che è un array referenziale, Python non ha alcun controllo su dove sono archiviati i dati, anche se l'elenco mantiene i riferimenti a dove si trovano i dati. A causa del funzionamento dell'hardware, è più efficiente avere i dati vicini l'uno all'altro, potrebbe essere utilizzato per lo stesso calcolo.

Nonostante questi vantaggi, per le liste e le tuple Python usa gli array referenziali perché sono comodi da usare. Tuttavia, se insisti nell'usare un array compatto, Python ti fornisce un modulo chiamato array che ti permette di fare questo:

creando un array compatto in python

Qui hai notato che siamo passati i come primo argomento a array. Perché per creare un array compatto dobbiamo specificare il tipo per la corretta allocazione di memoria. Per altri tipi di dati controlla questa tabella:

Tipi di dati nell'array

Se vuoi saperne di più sul modulo array clicca qui .

Uno svantaggio del modulo array è che non supporta i tipi di dati definiti dall'utente. Gli array compatti con tale struttura dati possono essere definiti utilizzando il modulo ctypes .

Matrici dinamiche

Quando creiamo un array compatto, specifichiamo la dimensione precisa di quell'array in modo che il computer sappia quale memoria allocare. Perché alloca l'area di memoria adiacente ad altri array.

In pratica non possiamo sempre conoscere la dimensione dei nostri array, potrebbero espandersi nel tempo. Come rimedio a questo problema, Python fornisce un'astrazione chiamata Dynamic Array.

Questa astrazione utilizza un'istanza di elenco che mantiene un array sottostante che ha una capacità superiore alla lunghezza dell'elenco effettivo. Questa capacità extra ci aiuta ad aggiungere sempre più dati all'elenco.

Quando alla fine esauriamo la capacità extra, Dynamic Array richiede un nuovo array più grande e copia tutti gli elementi nel nuovo array e il sistema recupera lo spazio dal vecchio array.

Python List si basa su questa astrazione ma tuple e stringhe sono immutabili (non possono essere modificate) quindi non si basano su questo.

Vale anche la pena ricordare che l'array dinamico non solo si espande in termini di dimensioni, ma può anche ridursi se eliminiamo elementi dall'elenco.

Liste e tuple

Quindi dall'analisi che abbiamo fatto nella sezione precedente, possiamo dividere i metodi Lists & Tuples in due tipi di metodi:

Metodi immutabili: metodi che esistono sia nelle tuple che negli elenchi e non ne modificano il contenuto. Di seguito è riportata una tabella di questi metodi e la loro complessità temporale:

Complessità dei metodi immutabili

Metodi mutanti: metodi che esistono solo negli elenchi in quanto modificano i dati sottostanti e la struttura dell'elenco. Di seguito è riportata una tabella di questi metodi e la loro complessità temporale:

Complessità dei metodi mutanti

Non abbiamo discusso qui cosa fa ciascun metodo (è intuitivo e facile) ma puoi trovare ulteriori informazioni su elenchi e tuple di Python .

Asporto

  • Gli array referenziali memorizzano i riferimenti nella loro memoria di array e quindi accedono ai valori effettivi tramite i riferimenti.
  • Gli array compatti memorizzano i dati effettivi in ​​una memoria contigua.
  • Gli array dinamici sono array che si espandono e si restringono automaticamente a seconda del numero di elementi in essi contenuti.
  • Gli elenchi sono basati su array referenziali e dinamici.
  • Le tuple sono basate su array referenziali.
  • Le stringhe sono basate su array compatti.

Linkedin:https://www.linkedin.com/in/mohamed-aziz-belaweid/

GitHub:https://github.com/azayz

Leggi le mie altre storie:

REALM: Recupero del modello di linguaggio aumentato Pretraining Riconoscimento delle emozioni facciali, guida pratica!

Iscriviti e ricevi una notifica ogni volta che pubblico qualcosa: