Length attribut

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Wieso ist die länge der liste,string nicht als attribut eingebaut, dann muss er es nur wenn man einen neuen macht die länge berechnen. Das wäre doch viel schneller?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Die Länge ist intern auch als Attribut implementiert. Im Fall von CPython weiß ich es auf jeden Fall. Bei den alternativen Interpretern gehe ich zumindest davon aus, da alles andere IMHO sinnfrei wäre. Nur der Zugriff auf Python-Ebene läuft halt über einen Funktionsaufruf.

Und es wird auch nicht bei 1.000.000 Elementen jedes Elemente erneut durchgezählt, sobald Element Nummer 1.000.001 dazu kommt, falls dies deine Befürchtung ist. So doof sind die Python-Entwickler nicht. ;)

Falls dich die interne Implementierung interessiert: Objects/listobject.c
Nutze die Suchfunktion deines Browsers, um darin `PyList_Append()` als Einstiegspunkt nehmen zu können.

EDIT: Da in der verlinkten Datei nicht direkt ersichtlich ist, ob die Länge als Attribut gespeichert wird, vielleicht noch ein paar weitere Erklärungen: Hinter dem in `app1()` verwendete Aufruf von `PyList_GET_SIZE` steckt das folgende Makro:

Code: Alles auswählen

#define PyList_GET_SIZE(op) Py_SIZE(op)
(siehe Include/listobject.h)

`Py_SIZE` ist seinerseits definiert als:

Code: Alles auswählen

#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
(siehe Include/object.h)

Und an der Stelle kann man gut sehen, dass mittels `->ob_size` etwas gemacht wird, was man in Python einen Attributzugriff nennen würde.
Zuletzt geändert von snafu am Freitag 5. April 2013, 12:07, insgesamt 2-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

fail hat geschrieben:Wieso ist die länge der liste,string nicht als attribut eingebaut, dann muss er es nur wenn man einen neuen macht die länge berechnen. Das wäre doch viel schneller?

Code: Alles auswählen

>>> name = 'Monty'
>>> print name.__len__
<method-wrapper '__len__' of str object at 0x02AF5240>
>>> print name.__len__()
5
Weißt du, wie die interne Implementierung dafür aussieht? Bist du sicher, dass der Wert immer berechnet wird?
Antworten