Description
Feature or enhancement
The Python/dtoa.c
library is responsible for formatting floating point numbers (double
) as strings and for parsing strings into numbers. The shared state is not thread-safe without the GIL:
Balloc
andBfree
use a per-interpreter free-list to avoid some allocations ofBigint
objectspow5mult
uses a per-interpreter append-only list ofBigint
powers of 5
For (1), we can just skip using the freelists in --disable-gil
builds. We already have a code path (Py_USING_MEMORY_DEBUGGER
) that doesn't use freelists.
Line 312 in d61313b
For (2), we can use atomic operations to append to the powers-of-5 linked list in a thread-safe manner. I don't think this needs to be guarded by a Py_NOGIL
checks, since each power-of-5 is only ever created once.
For context, here is the modification to Python/dtoa.c
in nogil-3.12. Note that it uses a PyMutex
for (2), which I think we can avoid.
dragonbox, Ryū, Grisu, Schubfach
In the past 5 or so years, there have been a number of faster float-to-string algorithms with the desirable attributes (correctly rounded, no "garabage" digits, etc.). To my knowledge they are also all thread-safe. "dragonbox" looks the most promising, but porting it to C is a bigger undertaking than making the existing dtoa.c
thread-safe.