Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0424.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT