Che cos'è l'elenco di matrici in python?

0

Ho letto nella pagina di complessità temporale Python :

A deque (double-ended queue) is represented internally as a doubly linked list. (Well, a list of arrays rather than objects, for greater efficiency.) Both ends are accessible, but even looking at the middle is slow, and adding to or removing from the middle is slower still.

Non capisco il significato di "elenco di matrici anziché di oggetti", come è correlato a una lista doppiamente collegata? L'implementazione di deque è esattamente come una lista doppiamente collegata, sarà utile se ulteriori dettagli possono essere forniti sulla sua implementazione.

    
posta Pranjal Kumar 05.07.2018 - 12:23
fonte

2 risposte

3

È possibile leggere il codice sorgente di CPython (l'implementazione di riferimento Python). Il tipo deque è implementato in C ( → codice sorgente ), ma il codice contiene molti commenti che parlano anche della tua domanda in alto:

Textbook implementations of doubly-linked lists store one datum per link, but that gives them a 200% memory overhead (a prev and next link for each datum) and it costs one malloc() call per data element. By using fixed-length blocks, the link to data ratio is significantly improved and there are proportionally fewer calls to malloc() and free().

vale a dire. utilizzando un elenco di blocchi doppiamente collegati (piccoli array) la deque è più efficiente sotto ogni aspetto rispetto a una normale lista doppiamente collegata.

Il layout della memoria è simile a:

NULL <- [ | | | | | | | ] <-> [ | | | | | | | ] -> NULL

vale a dire. i blocchi sono collegati tra loro. Se anteponiamo o aggiungiamo un elemento ma l'ultimo / ultimo blocco è già completo, possiamo aggiungere un altro blocco.

Questo non è l'unico modo per migliorare l'efficienza. Per esempio. invece di malloc () potrebbe essere usato un allocatore di arena personalizzato, poiché ogni collegamento nella lista collegata ha le stesse dimensioni. Tuttavia, l'utilizzo di blocchi di memoria contigua ha una migliore localizzazione della cache e riduce il sovraccarico dei puntatori prev / next.

Esiste una struttura dati alternativa per le code con proprietà simili: un buffer circolare ridimensionabile. Tuttavia, i buffer circolari possono essere difficili da implementare.

    
risposta data 05.07.2018 - 12:41
fonte
0

Per ogni singolo nodo avere un collegamento a quello avanti e indietro è costoso, dal punto di vista della memoria, quindi a volte vedrai un'implementazione che usa gli array per contenere più elementi contemporaneamente. L'interfaccia presentata al chiamante dovrebbe rimanere trasparente (in altre parole, si comporta esattamente allo stesso modo).

Questo è stato il modo in cui la gestione della memoria è stata eseguita in C, in quanto allocare memoria in blocchi troppo grandi a volte non era possibile acquisire, quindi allocare blocchi più piccoli e combinarli in un elenco collegato.

    
risposta data 05.07.2018 - 12:42
fonte

Leggi altre domande sui tag