5

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

例如:range(100000000000000000000000000)[-1]

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

4

2 回答 2

8

不需要获取上一个值来获取最后一个值。

它由compute_item函数计算(由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;
}
于 2013-10-21T12:53:44.150 回答
2

可能不是:

import timeit
print(timeit.timeit('range(10)[-1]'))
>>> 0.5438045680057257

print(timeit.timeit('range(100000000000000000000000000)[-1]'))
>>> 0.7502937959798146
于 2013-10-21T12:52:09.743 回答