Issue 31187: suboptimal code in Py_ReprEnter() (original) (raw)

in Objects/object.c, Py_ReprEnter() does the following: - try to retrieve the Py_Repr list from the thread-state dict. - in case the list is not in the dict, add it to the dict as an empty list. - check whether the received object is in the Py_Repr list, even in case the list was just created, and guaranteed to be empty.

I propose to put this check inside an else clause, so that it wouldn't take place in case the list is guaranteed to be empty, i.e.: list = _PyDict_GetItemId(dict, &PyId_Py_Repr); if (list == NULL) { list = PyList_New(0); ... } else { i = PyList_GET_SIZE(list); while (--i >= 0) { if (PyList_GET_ITEM(list, i) == obj) return 1; } }

I ran the test suite, and it seems that this change doesn't break anything, so I would be happy to open a PR for it.

PyList_GET_SIZE(list) is cheap (especially in comparison of _PyDict_GetItemId(), _PyDict_SetItemId() and PyList_New()), and its tiny overhead can be avoided at most once per thread's lifetime. I'm sure you can't measure the effect of this change.

If surrounding code be modified for other reasons, may be your change could be applied. But it alone just makes a code churn.