]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-110489: Optimise math.ceil for known exact float (#108801)
authorShantanu <12621235+hauntsaninja@users.noreply.github.com>
Fri, 6 Oct 2023 22:57:18 +0000 (15:57 -0700)
committerGitHub <noreply@github.com>
Fri, 6 Oct 2023 22:57:18 +0000 (22:57 +0000)
This matches a similar optimisation done for math.floor in
https://github.com/python/cpython/pull/21072

Misc/NEWS.d/next/Core and Builtins/2023-10-06-22-30-25.gh-issue-110489.rI2n8A.rst [new file with mode: 0644]
Modules/mathmodule.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-10-06-22-30-25.gh-issue-110489.rI2n8A.rst b/Misc/NEWS.d/next/Core and Builtins/2023-10-06-22-30-25.gh-issue-110489.rI2n8A.rst
new file mode 100644 (file)
index 0000000..6252d00
--- /dev/null
@@ -0,0 +1 @@
+Optimise :func:`math.ceil` when the input is exactly a float, resulting in about a 10% improvement.
index 2d896e7fe333a4035111a4e50bc41799032d7e8a..a4d9466559235137a9df63b9826bb1d7c9ea6eb4 100644 (file)
@@ -1125,8 +1125,12 @@ static PyObject *
 math_ceil(PyObject *module, PyObject *number)
 /*[clinic end generated code: output=6c3b8a78bc201c67 input=2725352806399cab]*/
 {
+    double x;
 
-    if (!PyFloat_CheckExact(number)) {
+    if (PyFloat_CheckExact(number)) {
+        x = PyFloat_AS_DOUBLE(number);
+    }
+    else {
         math_module_state *state = get_math_module_state(module);
         PyObject *method = _PyObject_LookupSpecial(number, state->str___ceil__);
         if (method != NULL) {
@@ -1136,11 +1140,10 @@ math_ceil(PyObject *module, PyObject *number)
         }
         if (PyErr_Occurred())
             return NULL;
+        x = PyFloat_AsDouble(number);
+        if (x == -1.0 && PyErr_Occurred())
+            return NULL;
     }
-    double x = PyFloat_AsDouble(number);
-    if (x == -1.0 && PyErr_Occurred())
-        return NULL;
-
     return PyLong_FromDouble(ceil(x));
 }
 
@@ -1196,8 +1199,7 @@ math_floor(PyObject *module, PyObject *number)
     if (PyFloat_CheckExact(number)) {
         x = PyFloat_AS_DOUBLE(number);
     }
-    else
-    {
+    else {
         math_module_state *state = get_math_module_state(module);
         PyObject *method = _PyObject_LookupSpecial(number, state->str___floor__);
         if (method != NULL) {