summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS1
-rw-r--r--Objects/longobject.c7
2 files changed, 8 insertions, 0 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index dcccc4a..510748b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -165,6 +165,7 @@ Core and Builtins
- Issue #25660: Fix TAB key behaviour in REPL with readline.
+- Issue #26288: Optimize PyLong_AsDouble.
Library
-------
diff --git a/Objects/longobject.c b/Objects/longobject.c
index d05de8b..c1edeac 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -2769,6 +2769,13 @@ PyLong_AsDouble(PyObject *v)
PyErr_SetString(PyExc_TypeError, "an integer is required");
return -1.0;
}
+ if (Py_ABS(Py_SIZE(v)) <= 1) {
+ /* Fast path; single digit will always fit decimal.
+ This improves performance of FP/long operations by at
+ least 20%. This is even visible on macro-benchmarks.
+ */
+ return (double)MEDIUM_VALUE((PyLongObject *)v);
+ }
x = _PyLong_Frexp((PyLongObject *)v, &exponent);
if ((x == -1.0 && PyErr_Occurred()) || exponent > DBL_MAX_EXP) {
PyErr_SetString(PyExc_OverflowError,