См Rationale section from PEP 424, которая представила __length_hint__
и дает представление о мотивации:
Будучи в состоянии предварительно выделить списки на основе ожидаемого размера, по оценкам __length_hint__
, может быть значительной оптимизации. Было замечено, что CPython запускает некоторый код быстрее, чем PyPy, только из-за присутствия этой оптимизации.
В дополнение к этому, документация for object.__length_hint__
проверяет факт, что это чисто функция оптимизации:
Вызывается для реализации operator.length_hint()
. Должен вернуть предполагаемую длину объекта (который может быть больше или меньше фактической длины). Длина должна быть целым числом >= 0
. Этот метод является чисто оптимизацией и никогда не требуется для правильности.
Так что __length_hint__
здесь, потому что это может привести к некоторым приятным оптимизациям.
PyObject_LengthHint
, first tries to get a value from object.__len__
(if it is defined), а затем пытается узнать, имеется ли object.__length_hint__
. Если ни один из них не существует, он возвращает значение по умолчанию 8
для списков.
listextend
, который вызывается из list_init
как заявил Эли в своем ответе, был изменен в соответствии с этим PEP, чтобы предложить эту оптимизацию для всего, что определяет либо __len__
или __length_hint__
.
list
не единственный, кто извлекает выгоду из этого, конечно, bytes
objects do:
>>> bytes(Foo())
len
getitem 0
...
b'\x00\x01\x04\t\x10\x19'
так do bytearray
objects but, only when you extend
them:
>>> bytearray().extend(Foo())
len
getitem 0
...
tuple
и объекты, которые создают an intermediary sequence to заселить себя:
>>> tuple(Foo())
len
getitem 0
...
(0, 1, 4, 9, 16, 25)
Если кто-то бродит, почему именно 'iter'
печатается перед тем'len'
в классе Bar
, а не после того, как это происходит с классом Foo
:
Это происходит потому, что если объект в руке определяет __iter__
, тем самым выполнив print('iter')
слишком. То же самое не происходит, если он возвращается к использованию __getitem__
.
Да, это, вероятно, резервирование пространства. Возможно, кто-то может просмотреть скомпилированный код и создать хороший ответ. –