On Tue, Dec 14, 2021 at 7:27 PM Eric Snow <ericsnowcurrently@gmail.com> wrote:
We have some options:
* live with the full penalty * make other changes to reduce the penalty to a more acceptable threshold than 5% * eliminate the penalty (e.g. claw back 5% elsewhere)
The last time I saw a benchmark on immortal object, it was clearly 10% slower overall on the pyperformance benchmark suite. That's a major slowdown.
* abandon all hope
I wrote https://bugs.python.org/issue39511 and https://github.com/python/cpython/pull/18301 to have per-interpreter None, True and False singletons. My change is backward compatible on the C API: you can still use "Py_None" in your C code. The code gets the singleton object from the current interpreter with a function call: #define Py_None Py_GetNone() Py_GetNone() is implemented as: "return _PyInterpreterState_GET()->none;" If _PyInterpreterState_GET() is modified to read a thread-local state, similar to the on-going work to get the Python thread state from a thread-local variable, Py_GetNone() should be "cheap" but I didn't run a benchmark. While I was working on this issue, I was fighting against other challenges caused by subinterpreters. I fixed some of them since that time. By the way, I made the _Py_IDENTIFIER() API and _PyUnicode_FromId() compatible with subinterpreters in Python 3.10. This change caused a subtle regression when using subintepreters (because an optimization made on an assumption on interned strings which is no longer true). The fix is trivial but I didn't wrote it yet: https://bugs.python.org/issue46006 Victor -- Night gathers, and now my watch begins. It shall not end until my death.