From: Yury Selivanov Date: Sat, 6 Feb 2016 00:40:01 +0000 (-0500) Subject: Issue #26288: Optimize PyLong_AsDouble. X-Git-Tag: v3.6.0a1~648 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=186c30b7ae2c304b863143809867cfef7eb1bf29;p=thirdparty%2FPython%2Fcpython.git Issue #26288: Optimize PyLong_AsDouble. --- diff --git a/Misc/NEWS b/Misc/NEWS index dcccc4af66e5..510748b25697 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 d05de8bf07a0..c1edeacf62e0 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,