changeset: 100167:986184c355e8 user: Yury Selivanov date: Fri Feb 05 19:40:01 2016 -0500 files: Misc/NEWS Objects/longobject.c description: Issue #26288: Optimize PyLong_AsDouble. diff -r f6a89f6cadd0 -r 986184c355e8 Misc/NEWS --- a/Misc/NEWS Fri Feb 05 18:26:20 2016 -0500 +++ b/Misc/NEWS Fri Feb 05 19:40:01 2016 -0500 @@ -165,6 +165,7 @@ - Issue #25660: Fix TAB key behaviour in REPL with readline. +- Issue #26288: Optimize PyLong_AsDouble. Library ------- diff -r f6a89f6cadd0 -r 986184c355e8 Objects/longobject.c --- a/Objects/longobject.c Fri Feb 05 18:26:20 2016 -0500 +++ b/Objects/longobject.c Fri Feb 05 19:40:01 2016 -0500 @@ -2769,6 +2769,13 @@ 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,