在Python 3.x中,
range(0,3)返回一个不可变的可迭代对象,它可以让你遍历它们,它不会产生列表,并且它们不会将所有的元素存储在内存中,而是在空中生成元素你正在迭代它们),而list(range(0,3))产生一个列表(通过遍历所有元素并在内部附加到列表中).
示例 –
>>> range(0,3)
range(0, 3)
>>> list(range(0,3))
[0, 1, 2]
理想情况下,如果您只想迭代该值范围,则range(0,3)将比(list(range(0,3))更快,因为后者在开始迭代之前产生列表的开销.
在Python 2.x中,range(0,3)生成一个列表,而我们也有一个xrange()函数,它具有与Python 3.x的range()函数相似的行为(xrange被重命名为Python 3.x中的范围) )
对于Python 3.5,从documentation –
Range objects implement the collections.abc.Sequence ABC, and provide features such as containment tests, element index lookup, slicing and support for negative indices
所以你可以做这样的事情 –
>>> range(0,10)[5]
5
>>> range(0,10)[3:7]
range(3, 7)
>>> 5 in range(6,10)
False
>>> 7 in range(1,8)
True
所有这些都是恒定的时间操作,从这个测试可以看出 –
In [11]: %timeit a = xrange(0,1000000)[1000]
1000000 loops, best of 3: 342 ns per loop
In [12]: %timeit a = xrange(0,1000000)[10000]
1000000 loops, best of 3: 342 ns per loop
In [13]: %timeit a = xrange(0,1000000)[100000]
1000000 loops, best of 3: 342 ns per loop
In [14]: %timeit a = xrange(0,1000000)[999999]
1000000 loops, best of 3: 342 ns per loop
In [15]: %timeit a = xrange(0,10000000)[9999999]
1000000 loops, best of 3: 339 ns per loop
In [16]: %timeit a = xrange(0,1000000000000)[9999999999]
1000000 loops, best of 3: 341 ns per loop