Python 2.X中的range和xrange函数之间有什么区别?
显然xrange更快,但是我不知道为什么它更快(到目前为止,除了轶事之外还没有证据表明它更快)或者除此之外还有什么不同
for i in range(0, 20): for i in xrange(0, 20):
解决方案
请参阅这篇文章以查找range和xrange之间的区别:
去引用:
range returns exactly what you think: a list of consecutive integers, of a defined length beginning with 0. xrange, however, returns an "xrange object", which acts a great deal like an iterator
xrange返回一个迭代器,一次只在内存中保留一个数字。 range将整个数字列表保留在内存中。
range创建一个列表,因此,如果执行range(1,10000000)
,它将在内存中创建一个带有9999999
元素的列表。
xrange是一个延迟计算的序列对象。
应该从@Thiago的提示中添加它,即在python3中,range等同于python的xrange
range生成整个列表并返回。 xrange不会-根据需要生成列表中的数字。
xrange使用迭代器(动态生成值),range返回一个列表。
不要花一些时间在图书馆参考上。对它越熟悉,就可以更快地找到此类问题的答案。关于内置对象和类型的前几章尤其重要。
The advantage of the xrange type is that an xrange object will always take the same amount of memory, no matter the size of the range it represents. There are no consistent performance advantages.
查找有关Python构造的快速信息的另一种方法是docstring和help-function:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful help(xrange)
这是出于优化的原因。
range()将从头到尾创建一个值列表(在示例中为0 .. 20)。在很大范围内,这将成为昂贵的操作。
另一方面,xrange()更优化了。它只会在需要时(通过xrange序列对象)计算下一个值,并且不会像range()那样创建所有值的列表。
range creates a list, so if you do range(1, 10000000) it creates a list in memory with 9999999 elements. xrange is a generator, so it is a sequence object is a that evaluates lazily.
的确如此,但是在Python 3中,范围将由Python 2 xrange()实现。如果需要实际生成列表,则需要执行以下操作:
list(range(1,100))
xrange仅存储范围参数并按需生成数字。但是,Python的C实现当前将其args限制为C long:
xrange(2**32-1, 2**32+1) # When long is 32 bits, OverflowError: Python int too large to convert to C long range(2**32-1, 2**32+1) # OK --> [4294967295L, 4294967296L]
请注意,在Python 3.0中只有range
,其行为类似于2.xxrange
,但对最小和最大端点没有限制。
range creates a list, so if you do range(1, 10000000) it creates a list in memory with 10000000 elements. xrange is a generator, so it evaluates lazily.
这为我们带来两个优点:
- 我们可以迭代更长的列表,而不会出现" MemoryError"。
- 当它懒散地解析每个数字时,如果我们尽早停止迭代,我们将不会浪费时间创建整个列表。
请记住,使用timeit模块来测试较小的代码片段更快!
$ python -m timeit 'for i in range(1000000):' ' pass' 10 loops, best of 3: 90.5 msec per loop $ python -m timeit 'for i in xrange(1000000):' ' pass' 10 loops, best of 3: 51.1 msec per loop
就个人而言,我总是使用range(),除非我处理的是非常大的列表-从时间上可以看出,对于一百万个条目的列表,额外的开销只有0.04秒。正如Corey所指出的那样,在Python 3.0中,xrange将会消失,而range仍将为我们提供良好的迭代器行为。