Python-Listen-Implementierung: Das Rätsel lösen
Python-Listen, ein integraler Bestandteil der Sprache, speichern Sammlungen von Elementen jeglicher Art. Viele Entwickler haben über die zugrunde liegende Implementierung spekuliert, eine endgültige Antwort gibt es jedoch noch nicht. Dieser Artikel befasst sich mit den Tiefen des C-Codes von Python, um die Wahrheit hinter der Listenrealisierung aufzudecken.
Bei der Untersuchung der Header-Datei listobject.h entdecken wir die grundlegende Struktur einer Python-Liste:
typedef struct { PyObject_HEAD Py_ssize_t ob_size; /* 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 */ Py_ssize_t allocated; } PyListObject;
Dieser Code zeigt, dass Python-Listen tatsächlich als Vektoren oder Arrays implementiert sind. Konkret nutzen sie eine Überzuweisungsstrategie, was bedeutet, dass Speicher im Voraus für mögliche Ergänzungen zur Liste zugewiesen wird.
Wenn die Liste ihr zugewiesenes Limit erreicht, erweitert der Größenänderungscode in listobject.c das Array durch Zuweisung von:
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6); new_allocated += newsize;
wobei newsize die angeforderte Größe darstellt, sei es zum Erweitern um eine beliebige Anzahl von Elementen oder einfach zum Anhängen eins.
Darüber hinaus bietet die Python-FAQ zusätzliche Einblicke in die Listenimplementierung und hebt deren dynamischen und effizienten Charakter hervor, der bei Bedarf die Größe ändern und gleichzeitig die Leistung beibehalten kann.
Das obige ist der detaillierte Inhalt vonWie implementiert Python seine Listen intern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!