Python hasattr vs getattr

Habe ich in letzter Zeit gelesen einige tweets und die python-Dokumentation über hasattr und er sagt:

hasattr(Objekt, name)

Die Argumente ein Objekt und ein string. Das Ergebnis ist True, wenn die Zeichenfolge ist der name >> einer der Objekt-Attribute, False, wenn nicht. (Dies erfolgt durch den Aufruf
getattr(object, name) und sehen, ob es löst einen AttributeError oder nicht.)

Es gibt ein motto in Python, der sagt, dass ist Einfacher um Vergebung zu bitten als Erlaubnis wo ich in der Regel Zustimmen.

Habe ich versucht zu tun, ein performance-test in diesem Fall mit einer wirklich einfachen python-code:

import timeit
definition="""\
class A(object):
    a = 1
a = A()
"""

stm="""\
hasattr(a, 'a')
"""
print timeit.timeit(stmt=stm, setup=definition, number=10000000)

stm="""\
getattr(a, 'a')
"""
print timeit.timeit(stmt=stm, setup=definition, number=10000000)

Mit den Ergebnissen:

$ python test.py
hasattr(a, 'a')
1.26515984535

getattr(a, 'a')
1.32518696785

Ive versucht auch, was passiert, wenn das Attribut nicht existiert und die Unterschiede zwischen getattr und hasattr sind größer. Also, was Ich gesehen habe bisher ist, dass getattr ist langsamer als hasattr, aber in der Dokumentation heißt es, dass es Anrufe getattr.

Ive gesucht der CPython-Implementierung von hasattr und getattr und es scheint, dass beide Aufruf der nächsten Funktion:

v = PyObject_GetAttr(v, name);

aber es gibt noch mehr boilerplate in getattr als in hasattr, dass macht es wahrscheinlich langsamer.

Wer weiß, warum Sie in der Dokumentation, die wir sagen, dass hasattr Anrufe getattr und wir scheinen ermutigen die Nutzer, um getattr statt hasattr, wenn es wirklich nicht wegen der Leistung? Nur weil es mehr pythonic?

Vielleicht bin ich etwas falsch in meinem test 🙂

Dank,

Raúl

  • Der Unterschied hier ist nicht Leistung. Du redest wie 5 Nanosekunden. Sie verlieren Tausende von Zeiten, die nur mit Hilfe von Python. Der Unterschied ist hier, welche ist die richtige für das, was Sie tun müssen.
  • Der Leistungsunterschied war nicht der Punkt. Ich habe nicht verstanden, warum Sie den Kommentar in der Dokumentation, die besagt, dass es implementiert wurde, der Aufruf von getattr dort war.
  • Vielleicht an einer Stelle es aufgerufen habe getattr, und jetzt ist es nicht, aber niemand aktualisiert, die docs...? Ehrlich gesagt, obwohl, das ist die Art von Aussage, die nicht gehören in der API-Dokumentation sowieso. Die Dokumente sollten erklären, was passiert, nicht wie es geschieht, es sei denn, das "wie" ist ein wesentlicher Teil des "was".
InformationsquelleAutor raulcumplido | 2014-07-26
Schreibe einen Kommentar