显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同

for i in range(0, 20):
for i in xrange(0, 20):

当前回答

根据扫描/打印0-N项的要求,range和xrange的工作原理如下。

range()-在内存中创建一个新列表,并获取整个0到N个项目(总共N+1个)并打印它们。xrange()-创建一个迭代器实例,该实例扫描项目并只将当前遇到的项目保存在内存中,因此始终使用相同的内存量。

如果所需的元素只是在列表的开头,那么它可以节省大量的时间和内存。

其他回答

range生成整个列表并返回它。xrange不——它根据需要生成列表中的数字。

range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个生成器,因此它是一个序列对象。

这是正确的,但在Python3中,range()将由Python2xrange()实现。如果您需要实际生成列表,则需要执行以下操作:

list(range(1,100))

range(x,y)返回x和y之间的每个数字的列表,如果使用for循环,则range会变慢。事实上,范围的指数范围更大。range(x.y)将打印出x和y之间所有数字的列表

xrange(x,y)返回xrange,但如果使用for循环,xrange会更快。xrange的索引范围较小。xrange不仅会打印出xrange(x,y),还会保留其中的所有数字。

[In] range(1,10)
[Out] [1, 2, 3, 4, 5, 6, 7, 8, 9]
[In] xrange(1,10)
[Out] xrange(1,10)

如果您使用for循环,那么它会起作用

[In] for i in range(1,10):
        print i
[Out] 1
      2
      3
      4
      5
      6
      7
      8
      9
[In] for i in xrange(1,10):
         print i
[Out] 1
      2
      3
      4
      5
      6
      7
      8
      9

使用循环时没有太大的区别,但打印循环时有区别!

对于范围(..)/xrange(..)的较小参数,差异减小:

$ python -m timeit "for i in xrange(10111):" " for k in range(100):" "  pass"
10 loops, best of 3: 59.4 msec per loop

$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" "  pass"
10 loops, best of 3: 46.9 msec per loop

在这种情况下,xrange(100)的效率仅提高约20%。

xrange使用迭代器(动态生成值),range返回一个列表。