显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
当前回答
range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。
这给您带来了两个好处:
您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。
其他回答
在Python 2.x中:
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个延迟求值的序列对象。
在Python 3中:
range相当于Python 2的xrange。要获得列表,必须显式使用list(range(…))。xrange不再存在。
在python 2.x中
range(x)返回一个列表,该列表是在内存中用x元素创建的。
>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]
xrange(x)返回一个xrange对象,它是一个生成器obj,可以根据需要生成数字。它们是在for循环(惰性评估)期间计算的。
对于循环,这比range()稍快,内存效率更高。
>>> b = xrange(5)
>>> b
xrange(5)
range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。
这给您带来了两个好处:
您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。
range():range(1,10)返回从1到10个数字的列表&将整个列表保存在内存中。
xrange():与range()类似,但不是返回列表,而是返回一个对象,该对象根据需要生成范围内的数字。对于循环,这比range()稍快,内存效率更高。xrange()对象类似于迭代器,并根据需要生成数字。(懒惰的评估)
In [1]: range(1,10)
Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [2]: xrange(10)
Out[2]: xrange(10)
In [3]: print xrange.__doc__
xrange([start,] stop[, step]) -> xrange object
range生成整个列表并返回它。xrange不——它根据需要生成列表中的数字。