Siehe Rationale section from PEP 424 die __length_hint__
eingeführt und bietet einen Einblick auf die Motivation:
Die Möglichkeit, Listen über die zu erwartende Größe vorbelegt basiert, wie von __length_hint__
geschätzt, kann eine signifikante Optimierung sein. Es wurde beobachtet, dass CPython Code schneller ausführt als PyPy, nur weil diese Optimierung vorhanden ist.
Zusätzlich zu, dass überprüft die Dokumentation for object.__length_hint__
die Tatsache, dass dies eine reine Optimierungsfunktion ist:
Genannt operator.length_hint()
zu implementieren. Sollte eine geschätzte Länge für das Objekt zurückgeben (die größer oder kleiner als die tatsächliche Länge sein kann). Die Länge muss eine Ganzzahl >= 0
sein. Diese Methode ist rein eine Optimierung und wird nie für die Richtigkeit erforderlich.
Also __length_hint__
ist hier, weil es einige nette Optimierungen ergeben kann.
PyObject_LengthHint
, first tries to get a value from object.__len__
(if it is defined) und versucht dann zu sehen, ob object.__length_hint__
verfügbar ist. Wenn keines vorhanden ist, wird der Standardwert 8
für Listen zurückgegeben.
listextend
, die von list_init
genannt wird, wie Eli in seiner Antwort erwähnt, wurde nach diesem PEP modifiziert diese Optimierung für alles bieten, die entweder ein __len__
oder ein __length_hint__
definiert.
list
ist nicht die einzige, die von diesem profitiert, natürlich, bytes
objects do:
>>> bytes(Foo())
len
getitem 0
...
b'\x00\x01\x04\t\x10\x19'
so do bytearray
objects but, only when you extend
them:
>>> bytearray().extend(Foo())
len
getitem 0
...
und tuple
Objekte, die an intermediary sequence to füllen sich erstellen:
>>> tuple(Foo())
len
getitem 0
...
(0, 1, 4, 9, 16, 25)
Wenn jemand wandert, warum genau 'iter'
vor'len'
in der Klasse gedruckt wird Bar
und nicht nach dem, wie mit Klasse geschieht Foo
:
Dies, weil, wenn das Objekt in der Hand definiert ein __iter__
, wodurch die print('iter')
läuft auch. Dasselbe passiert nicht, wenn es auf __getitem__
zurückgreift.
Ja, es ist wahrscheinlich die Platzreservierung. Vielleicht kann jemand den kompilierten Code sehen und eine gute Antwort erstellen. –