Python 3 では、 range はインデックス作成をサポートしていますが、それがどのように機能するのか正確には疑問に思っています。
例えば:range(100000000000000000000000000)[-1]
範囲関数が実際に限られた量のメモリを占有する範囲オブジェクトを返すという基本的な理解があります。最後の値を取得するには、以前のすべての値を計算する必要があるということですか?
Python 3 では、 range はインデックス作成をサポートしていますが、それがどのように機能するのか正確には疑問に思っています。
例えば:range(100000000000000000000000000)[-1]
範囲関数が実際に限られた量のメモリを占有する範囲オブジェクトを返すという基本的な理解があります。最後の値を取得するには、以前のすべての値を計算する必要があるということですか?
最後の値を取得するために前の値を取得する必要はありません。
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;
}
おそらくそうではありません:
import timeit
print(timeit.timeit('range(10)[-1]'))
>>> 0.5438045680057257
print(timeit.timeit('range(100000000000000000000000000)[-1]'))
>>> 0.7502937959798146