Skip to content

Commit bf88016

Browse files
committed
Add fast path for single-argument range
1 parent c62144a commit bf88016

1 file changed

Lines changed: 20 additions & 4 deletions

File tree

‎Objects/rangeobject.c‎

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,16 @@ compute_range_length(PyObject *start, PyObject *stop, PyObject *step)
240240
assert(PyLong_Check(stop));
241241
assert(PyLong_Check(step));
242242

243+
/* fast path for one argument case of range */
244+
if (start == zero && step == one) {
245+
if (_PyLong_IsPositive( (const PyLongObject *)stop) ) {
246+
return Py_NewRef(stop);
247+
}
248+
else {
249+
return zero;
250+
}
251+
}
252+
243253
/* fast path when all arguments fit into a long integer */
244254
long len = compute_range_length_long(start, stop, step);
245255
if (len >= 0) {
@@ -1135,13 +1145,19 @@ range_iter(PyObject *seq)
11351145

11361146
/* If all three fields and the length convert to long, use the int
11371147
* version */
1138-
lstart = PyLong_AsLong(r->start);
1139-
if (lstart == -1 && PyErr_Occurred()) {
1148+
lstop = PyLong_AsLong(r->stop);
1149+
if (lstop == -1 && PyErr_Occurred()) {
11401150
PyErr_Clear();
11411151
goto long_range;
11421152
}
1143-
lstop = PyLong_AsLong(r->stop);
1144-
if (lstop == -1 && PyErr_Occurred()) {
1153+
1154+
if (r->start == _PyLong_GetZero() && r->step == _PyLong_GetOne() ) {
1155+
/* fast path for one argument range */
1156+
return fast_range_iter(0, lstop, 1, Py_MAX(0, (long)lstop));
1157+
}
1158+
1159+
lstart = PyLong_AsLong(r->start);
1160+
if (lstart == -1 && PyErr_Occurred()) {
11451161
PyErr_Clear();
11461162
goto long_range;
11471163
}

0 commit comments

Comments
 (0)