在Python 3中,range支持索引,但我想知道它是如何工作的。
例如:
例如:
range(100000000000000000000000000)[-1]
我基本了解range函数实际上返回一个占用有限内存的range对象。这是否意味着要获取最后一个值,必须计算出所有先前的值?range(100000000000000000000000000)[-1]
我基本了解range函数实际上返回一个占用有限内存的range对象。这是否意味着要获取最后一个值,必须计算出所有先前的值?compute_item
函数计算(该函数由compute_range_item
调用 <- range_item
...)。
< p >来自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;
}
timeit.timeit('range(9999999999999)[-1]')
的执行时间比timeit.timeit('range(9999999999999)[1]')
要长近30%? - aIKidrange(9999999999999)[-1]
返回9999999999998
,而range(9999999999999)[1]
返回1
。 1
占用28字节(在CPython中进行了内部化),9999999999998
占用32字节。(CPython 3.3.2 64位)。多次分配/释放对象可能需要一些时间。 - falsetru可能不是:
import timeit
print(timeit.timeit('range(10)[-1]'))
>>> 0.5438045680057257
print(timeit.timeit('range(100000000000000000000000000)[-1]'))
>>> 0.7502937959798146