Come sono accessibili internamente gli elementi della lista in python?

1

Come se volessi accedere a un elemento dell'array in C, è implementato in questo modo: Ad esempio: se a = {0, 1, 2, 3} è un array se voglio accedere all'indice numero 2 scriverò un [2] e la formula che è implementata internamente è (a + 2 * sizeof (int) ) per ottenere l'indirizzo iniziale dell'indice numero 2.

Ma questo può essere fatto perché sappiamo che la dimensione di ogni elemento nella matrice è corretta.

Ma questo non è il caso nelle liste python possiamo immagazzinare oggetti di dimensioni variabili negli elenchi.

Quindi la mia domanda è: in che modo Python accede a una particolare posizione di indice negli elenchi? La complessità temporale O (1) è simile a C ??

    
posta Pranjal Kumar 13.05.2018 - 18:03
fonte

1 risposta

4

Ogni valore Python, sia esso un oggetto, tuple, int o None, è rappresentato come PyObject* in C. Poiché questo è un puntatore, tutti questi valori hanno la stessa dimensione (anche se la struttura PyObject può avere dimensioni diverse, a seconda di ciò che rappresenta). (Vedi: Include/object.h )

Quindi una lista Python contiene internamente un array C di tipo PyObject** , che consente l'accesso O (1) lungo le normali regole C. (Vedi: Include/listobject.h e PyList_GetItem() in Objects/listobject.c )

Questo tecnicamente vale solo per l'implementazione di riferimento CPython, ma altre implementazioni saranno simili. Il punto cruciale è che il linguaggio Python definisce il proprio modello di dati e il tipo di sistema che non si adatta direttamente al sistema di tipi C.

Poiché l'uso di oggetti Python può essere uno spreco, la libreria NumPy fornisce array densamente compressi. Ma ora hanno un tipo esplicito per tutti i valori. Se disponi di un NumPy ndarray di tipo float, non puoi memorizzare inte in quella matrice.

    
risposta data 13.05.2018 - 18:25
fonte

Leggi altre domande sui tag