PEP 424 – Eine Methode zur Bereitstellung eines Längenhinweises
- Autor:
- Alex Gaynor <alex.gaynor at gmail.com>
- Status:
- Final
- Typ:
- Standards Track
- Erstellt:
- 14-Jul-2012
- Python-Version:
- 3.4
- Post-History:
- 15-Jul-2012
Inhaltsverzeichnis
Zusammenfassung
CPython definiert derzeit eine Methode __length_hint__ für mehrere Typen, wie z. B. verschiedene Iteratoren. Diese Methode wird dann von verschiedenen anderen Funktionen (wie list) verwendet, um Listen basierend auf der Schätzung, die von __length_hint__ zurückgegeben wird, vorab zu dimensionieren. Typen, die nicht größenbestimmt sind und daher __len__ nicht definieren sollten, können dann __length_hint__ definieren, um eine Größe (wie bei vielen Iteratoren) zu schätzen oder zu berechnen.
Spezifikation
Diese PEP dokumentiert formal __length_hint__, damit andere Interpreter und Nicht-Standard-Bibliotheksmodule von Python sie implementieren können.
__length_hint__ muss eine Ganzzahl zurückgeben (andernfalls wird ein TypeError ausgelöst) oder NotImplemented, und muss nicht korrekt sein. Es kann einen Wert zurückgeben, der entweder größer oder kleiner als die tatsächliche Größe des Containers ist. Ein Rückgabewert von NotImplemented zeigt an, dass keine endliche Längenschätzung vorhanden ist. Es darf keinen negativen Wert zurückgeben (andernfalls wird ein ValueError ausgelöst).
Zusätzlich wird eine neue Funktion operator.length_hint hinzugefügt, mit den folgenden Semantiken (die definieren, wie __length_hint__ verwendet werden soll)
def length_hint(obj, default=0):
"""Return an estimate of the number of items in obj.
This is useful for presizing containers when building from an
iterable.
If the object supports len(), the result will be
exact. Otherwise, it may over- or under-estimate by an
arbitrary amount. The result will be an integer >= 0.
"""
try:
return len(obj)
except TypeError:
try:
get_hint = type(obj).__length_hint__
except AttributeError:
return default
try:
hint = get_hint(obj)
except TypeError:
return default
if hint is NotImplemented:
return default
if not isinstance(hint, int):
raise TypeError("Length hint must be an integer, not %r" %
type(hint))
if hint < 0:
raise ValueError("__length_hint__() should return >= 0")
return hint
Begründung
Die Möglichkeit, Listen basierend auf der erwarteten Größe, wie sie von __length_hint__ geschätzt wird, vorab zuzuweisen, kann eine bedeutende Optimierung darstellen. Es wurde beobachtet, dass CPython einige Codes schneller ausführt als PyPy, ausschließlich wegen dieser vorhandenen Optimierung.
Urheberrecht
Dieses Dokument wurde in den öffentlichen Bereich gestellt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0424.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT