From cceb47a068a70dffcd3aceb843f43aa51395ec47 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 2 Oct 2020 00:15:48 +0900 Subject: [PATCH 1/2] bpo-41902: Micro optimization for compute_item of range --- .../2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst | 3 +++ Objects/rangeobject.c | 15 ++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst new file mode 100644 index 000000000000000..b118a6a36fae3fe --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2020-10-02-13-32-05.bpo-41902.ZKTxzW.rst @@ -0,0 +1,3 @@ +Micro optimization when compute :c:member:`~PySequenceMethods.sq_item` and +:c:member:`~PyMappingMethods.mp_subscript` of :class:`range`. Patch by +Dong-hee Na. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index ba6d4257174950f..09a7207a9c202e9 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -254,11 +254,16 @@ compute_item(rangeobject *r, PyObject *i) /* PyLong equivalent to: * return r->start + (i * r->step) */ - incr = PyNumber_Multiply(i, r->step); - if (!incr) - return NULL; - result = PyNumber_Add(r->start, incr); - Py_DECREF(incr); + if (r->step == _PyLong_One) { + result = PyNumber_Add(r->start, i); + } else { + incr = PyNumber_Multiply(i, r->step); + if (!incr) { + return NULL; + } + result = PyNumber_Add(r->start, incr); + Py_DECREF(incr); + } return result; } From c360ce70dd95d002d90099221ab6ff324620616d Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Fri, 2 Oct 2020 22:35:32 +0900 Subject: [PATCH 2/2] Update Objects/rangeobject.c Co-authored-by: Victor Stinner --- Objects/rangeobject.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index 09a7207a9c202e9..eaa48d5f44fcc7d 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -256,7 +256,8 @@ compute_item(rangeobject *r, PyObject *i) */ if (r->step == _PyLong_One) { result = PyNumber_Add(r->start, i); - } else { + } + else { incr = PyNumber_Multiply(i, r->step); if (!incr) { return NULL;