Skip to content

Commit

Permalink
bpo-41342: Convert int.__round__ to Argument Clinic (pythonGH-21549)
Browse files Browse the repository at this point in the history
  • Loading branch information
serhiy-storchaka authored Jul 20, 2020
1 parent 12f4334 commit 5a2bac7
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:func:`round` with integer argument is now faster (9--60%).
36 changes: 35 additions & 1 deletion Objects/clinic/longobject.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 15 additions & 7 deletions Objects/longobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -5155,10 +5155,22 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b)
return NULL;
}

/*[clinic input]
int.__round__
ndigits as o_ndigits: object = NULL
/
Rounding an Integral returns itself.
Rounding with an ndigits argument also returns an integer.
[clinic start generated code]*/

static PyObject *
long_round(PyObject *self, PyObject *args)
int___round___impl(PyObject *self, PyObject *o_ndigits)
/*[clinic end generated code: output=954fda6b18875998 input=1614cf23ec9e18c3]*/
{
PyObject *o_ndigits=NULL, *temp, *result, *ndigits;
PyObject *temp, *result, *ndigits;

/* To round an integer m to the nearest 10**n (n positive), we make use of
* the divmod_near operation, defined by:
Expand All @@ -5174,8 +5186,6 @@ long_round(PyObject *self, PyObject *args)
*
* m - divmod_near(m, 10**n)[1].
*/
if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
return NULL;
if (o_ndigits == NULL)
return long_long(self);

Expand Down Expand Up @@ -5536,9 +5546,7 @@ static PyMethodDef long_methods[] = {
"Flooring an Integral returns itself."},
{"__ceil__", long_long_meth, METH_NOARGS,
"Ceiling of an Integral returns itself."},
{"__round__", (PyCFunction)long_round, METH_VARARGS,
"Rounding an Integral returns itself.\n"
"Rounding with an ndigits argument also returns an integer."},
INT___ROUND___METHODDEF
INT___GETNEWARGS___METHODDEF
INT___FORMAT___METHODDEF
INT___SIZEOF___METHODDEF
Expand Down

0 comments on commit 5a2bac7

Please sign in to comment.