在python 3中,range支持索引,但我想知道它是如何工作的。
例如:range(100000000000000000000000000)[-1]
我基本了解范围函数实际上返回占用有限内存量的范围对象。这是否意味着要获得最后一个值,它必须计算所有以前的值?
答案 0 :(得分:8)
获取最后一个值不需要获取先前的值。
它由compute_item
function计算(由compute_range_item
< - range_item
调用...)。
来自Python 3.3源代码(Objects / rangeobjects.c)
static PyObject *
compute_item(rangeobject *r, PyObject *i)
{
PyObject *incr, *result;
/* 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);
return result;
}
答案 1 :(得分:2)
可能不是:
import timeit
print(timeit.timeit('range(10)[-1]'))
>>> 0.5438045680057257
print(timeit.timeit('range(100000000000000000000000000)[-1]'))
>>> 0.7502937959798146