Simple but important optimization for descr_check(): instead of the
expensive and overly general PyObject_IsInstance(), call
PyObject_TypeCheck() which is a macro that often avoids a call, and if
it does make a call, calls the much more efficient PyType_IsSubtype().
This saved 6% on a benchmark for slot lookups.
diff --git a/Objects/descrobject.c b/Objects/descrobject.c
index cbf9e16..6daffc6 100644
--- a/Objects/descrobject.c
+++ b/Objects/descrobject.c
@@ -65,7 +65,7 @@
*pres = (PyObject *)descr;
return 1;
}
- if (!PyObject_IsInstance(obj, (PyObject *)(descr->d_type))) {
+ if (!PyObject_TypeCheck(obj, descr->d_type)) {
PyErr_Format(PyExc_TypeError,
"descriptor '%s' for '%s' objects "
"doesn't apply to '%s' object",