gh-110489: Optimise math.ceil for known exact float (#108801)

This matches a similar optimisation done for math.floor in
https://github.com/python/cpython/pull/21072
This commit is contained in:
Shantanu 2023-10-06 15:57:18 -07:00 committed by GitHub
parent 201dc11aeb
commit f013b47504
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 7 deletions

View file

@ -0,0 +1 @@
Optimise :func:`math.ceil` when the input is exactly a float, resulting in about a 10% improvement.

View 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) {