Length attribut
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:
(siehe Include/listobject.h)
`Py_SIZE` ist seinerseits definiert als:
(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.
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)
`Py_SIZE` ist seinerseits definiert als:
Code: Alles auswählen
#define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size)
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.
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