在使用索引时,范围是否必须计算所有先前的值

时间:2013-10-21 12:46:45

标签: python python-3.x

在python 3中,range支持索引,但我想知道它是如何工作的。

例如:range(100000000000000000000000000)[-1]

我基本了解范围函数实际上返回占用有限内存量的范围对象。这是否意味着要获得最后一个值,它必须计算所有以前的值?

2 个答案:

答案 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