GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — Improve the Efficiency of Python3.11.1 __getattr__ · Issue #102213 · python/cpython Closed Labels performancePerformance or resource usagePerformance or resource usagetype-featureA feature request or enhancementA feature request or enhancement DescriptionFeature or enhancement
PitchWe can use this test code: import time import sys class A: def foo(self): print("Call A.foo!") def __getattr__(self, name): return 2 @property def ppp(self): return 3 class B(A): def foo(self): print("Call B.foo!") class C(B): def __init__(self) -> None: self.pps = 1 def foo(self): print("Call C.foo!") def main(): start = time.time() for i in range(1, 1000000): pass end = time.time() peer = end - start c = C() print(f"Python version of {sys.version}") start = time.time() for i in range(1, 1000000): s = c.pps end = time.time() print(f"Normal getattr spend time: {end - start - peer}") start = time.time() for i in range(1, 1000000): s = c.ppa end = time.time() print(f"Call __getattr__ spend time: {end - start - peer}") start = time.time() for i in range(1, 1000000): s = c.ppp end = time.time() print(f"Call property spend time: {end - start - peer}") if __name__ == "__main__": main() The result shows how slow When we define
PyObject * PyObject_GenericTryGetAttr(PyObject *obj, PyObject *name) { return _PyObject_GenericGetAttrWithDict(obj, name, NULL, 1); }
if (getattribute == NULL || (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) && ((PyWrapperDescrObject *)getattribute)->d_wrapped == (void *)PyObject_GenericGetAttr)) // res = PyObject_GenericGetAttr(self, name); res = PyObject_GenericTryGetAttr(self, name); else { Py_INCREF(getattribute); res = call_attribute(self, getattribute, name); Py_DECREF(getattribute); } if (res == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); res = call_attribute(self, getattr, name); } Py_DECREF(getattr); return res; Rebuild python, it really become faster: Previous discussion
Linked PRsActivity
MetadataMetadataAssigneesLabelsperformancePerformance or resource usagePerformance or resource usagetype-featureA feature request or enhancementA feature request or enhancement ProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |