CPython currently defines a __length_hint__ method on several types, such as various iterators. This method is then used by various other functions (such as list) to presize lists based on the estimate returned by __length_hint__. Types which are not sized, and thus should not define __len__, can then define __length_hint__, to allow estimating or computing a size (such as many iterators).
This PEP formally documents __length_hint__ for other interpreters and non-standard-library Python modules to implement.
__length_hint__ must return an integer (else a TypeError is raised) or NotImplemented, and is not required to be accurate. It may return a value that is either larger or smaller than the actual size of the container. A return value of NotImplemented indicates that there is no finite length estimate. It may not return a negative value (else a ValueError is raised).
In addition, a new function operator.length_hint hint is added, with the following semantics (which define how __length_hint__ should be used):
Being able to pre-allocate lists based on the expected size, as estimated by __length_hint__, can be a significant optimization. CPython has been observed to run some code faster than PyPy, purely because of this optimization being present.
This document has been placed into the public domain.
Source: https://github.com/python/peps/blob/main/peps/pep-0424.rst
Last modified: 2025-02-01 08:59:27 UTC