2009-05-27 9 views
54

Welche typische Datenstruktur wird verwendet, um den integrierten Listendatentyp von Python zu implementieren?Was ist die zugrunde liegende Datenstruktur für Python-Listen?

+0

zwei Möglichkeiten: 1) nur Neugier, oder 2) vorzeitige Optimierung. – flybywire

+0

Jemand hat mir diese Frage gestellt und ich sagte ihnen, dass meine Intuition war, dass die Implementierung Array-basiert war, aber ich war mir nicht sicher. Das hat meine Neugier etwas erhöht und ich entscheide mich zu fragen. – Nixuz

+13

Ob Sie es glauben oder nicht, ich habe ein paar Minuten für die Antwort gegoogelt und selbst wenn ich den Quellcode heruntergeladen hätte, würde ich wahrscheinlich nicht wissen, wo ich anfangen soll. Ich nahm an, dass jemand hier die Antwort mit minimalem Aufwand kennen würde und es scheint, dass ich recht hatte. Einfacher Ruf für sie, schnelle Antwort für mich, jeder gewinnt. – Nixuz

Antwort

42

Listenobjekte sind als Arrays implementiert. Sie sind für schnelle Operationen mit fester Länge optimiert und verursachen O (n) Speicherbewegungskosten für pop (0) und Operationen (0, v), die sowohl die Größe als auch die Position der zugrunde liegenden Datendarstellung ändern.

Siehe auch: http://docs.python.org/library/collections.html#collections.deque

Btw, ich finde es interessant, dass die Python-Tutorial auf Datenstrukturen empfehlen Pop mit (0) einer Warteschlange zu simulieren, aber nicht O (n) oder die deque Option erwähnen .

http://docs.python.org/tutorial/datastructures.html#using-lists-as-queues

+5

Sehr guter Punkt über das Tutorial! Das sollte behoben werden. –

+4

Das Tutorial existierte lange lange vor dem Deque-Modul, deshalb. Melden Sie es an bugs.python.org, wenn möglich mit einem Patch für einen korrekten Satz und das Tutorial gibt keine falschen Hinweise mehr. –

23

CPython:

typedef struct { 
    PyObject_VAR_HEAD 
    /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ 
    PyObject **ob_item; 

    /* ob_item contains space for 'allocated' elements. The number 
    * currently in use is ob_size. 
    * Invariants: 
    *  0 <= ob_size <= allocated 
    *  len(list) == ob_size 
    *  ob_item == NULL implies ob_size == allocated == 0 
    * list.sort() temporarily sets allocated to -1 to detect mutations. 
    * 
    * Items must normally not be NULL, except during construction when 
    * the list is not yet visible outside the function that builds it. 
    */ 
    Py_ssize_t allocated; 
} PyListObject; 

Wie in der folgenden Zeile zu sehen ist, wird die Liste als ein Array von Zeigern auf PyObjects erklärt.

PyObject **ob_item; 
Verwandte Themen