New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve the Efficiency of Python3.11.1 __getattr__ #102213
Comments
Could you submit a pull request please? I'll try to review it. |
when __getattr__ is defined, python with try to find an attribute using _PyObject_GenericGetAttrWithDict find nothing is reasonable so we don't need an exception, it will hurt performance.
when __getattr__ is defined, python with try to find an attribute using _PyObject_GenericGetAttrWithDict find nothing is reasonable so we don't need an exception, it will hurt performance.
I have already submitted a pull request, but the default assigned reviewer is too busy to review it. Could you please review it and provide some suggestions when you are available? Thank you very much. |
Sorry. I didn't see the pull request (pull requests linked to an issue don't ping me even though I'm subscribe to the issue). I'll review it. Thanks! |
Thank you. I know that contributors in open source communities are very busy, so I didn't want to bother you with a “polite ping” :) I really appreciate your review. |
When __getattr__ is defined, python with try to find an attribute using _PyObject_GenericGetAttrWithDict find nothing is reasonable so we don't need an exception, it will hurt performance.
…102248) When __getattr__ is defined, python with try to find an attribute using _PyObject_GenericGetAttrWithDict find nothing is reasonable so we don't need an exception, it will hurt performance.
…ythonGH-102248)" This reverts commit aa0a73d.
Feature or enhancement
__getattr__
in Python3.11.1 is much slower than@Property
and visiting an object's attribute. It's even slower than Python3.10.4._PyObject_GenericGetAttrWithDict
is the key reason. If Python3 fails finding an attribute in normal ways, it will return NULL and raise an exception. But raising an exception has performance cost. Python3.11.1 add set_attribute_error_context to supportFine Grained Error Locations in Tracebacks
. It makes things worser.Pitch
We can use this test code:
The result shows how slow
__getattr__
is:When we define
__getattr__
, failed to find an attribute is what we expected. If we can get this result and then call__getattr__
without exception handling, it will be faster.I tried to modify Python3.11.1 like this:
object.c
:typeobject.c
:Rebuild python, it really become faster:
spend time: 0.13772845268249512.
Previous discussion
getattr is much slower in Python3.11
Linked PRs
__getattr__
(GH-102248)" #103332The text was updated successfully, but these errors were encountered: