STINNER Victor <vstin...@python.org> added the comment:

PR 22479 avoids calling PyNumber_FloorDivide(a, b) if b == 1 (if b == 
_PyLong_One): it makes range.index(a, 1) call 214 ns faster. I'm surprised that 
PyNumber_FloorDivide(a, 1) takes 214 ns. Does it spend most time in 
binary_op1()? Or PyNumber_FloorDivide()?

long_div(a, 1) is quite simple:

    CHECK_BINOP(a, b);

    if (Py_ABS(Py_SIZE(a)) == 1 && Py_ABS(Py_SIZE(b)) == 1) {
        return fast_floor_div((PyLongObject*)a, (PyLongObject*)b);

with:

static PyObject *
fast_floor_div(PyLongObject *a, PyLongObject *b)
{
    sdigit left = a->ob_digit[0];
    sdigit right = b->ob_digit[0];
    sdigit div;
    if (Py_SIZE(a) == Py_SIZE(b)) {
        div = left / right;
    }
    else {
        div = -1 - (left - 1) / right;
    }
    return PyLong_FromLong(div);
}

Do we need another fast-path in long_div(a, b) when b == _PyLong_One? Just 
return a in this case.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue41902>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to