Seite 1 von 1

Length attribut

Verfasst: Freitag 5. April 2013, 11:37
von fail
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?

Re: Length attribut

Verfasst: Freitag 5. April 2013, 11:44
von snafu
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.

Re: Length attribut

Verfasst: Freitag 5. April 2013, 11:45
von /me
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?