5

Python 3 では、 range はインデックス作成をサポートしていますが、それがどのように機能するのか正確には疑問に思っています。

例えば: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 に答える