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

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

当前回答

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

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

其他回答

当在一个循环中测试range和xrange时(我知道我应该使用timeit,但这是使用一个简单的列表理解示例从内存中快速删除的),我发现如下:

import time

for x in range(1, 10):

    t = time.time()
    [v*10 for v in range(1, 10000)]
    print "range:  %.4f" % ((time.time()-t)*100)

    t = time.time()
    [v*10 for v in xrange(1, 10000)]
    print "xrange: %.4f" % ((time.time()-t)*100)

其给出:

$python range_tests.py
range:  0.4273
xrange: 0.3733
range:  0.3881
xrange: 0.3507
range:  0.3712
xrange: 0.3565
range:  0.4031
xrange: 0.3558
range:  0.3714
xrange: 0.3520
range:  0.3834
xrange: 0.3546
range:  0.3717
xrange: 0.3511
range:  0.3745
xrange: 0.3523
range:  0.3858
xrange: 0.3997 <- garbage collection?

或者,在for循环中使用xrange:

range:  0.4172
xrange: 0.3701
range:  0.3840
xrange: 0.3547
range:  0.3830
xrange: 0.3862 <- garbage collection?
range:  0.4019
xrange: 0.3532
range:  0.3738
xrange: 0.3726
range:  0.3762
xrange: 0.3533
range:  0.3710
xrange: 0.3509
range:  0.3738
xrange: 0.3512
range:  0.3703
xrange: 0.3509

我的代码段测试是否正确?对xrange的较慢实例有何评论?或者更好的例子:-)

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

从帮助文档中。

Python 2.7.12

>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

>>> print xrange.__doc__
xrange(stop) -> xrange object
xrange(start, stop[, step]) -> xrange object

Like range(), but instead of returning a list, returns an object that
generates the numbers in the range on demand.  For looping, this is 
slightly faster than range() and more memory efficient.

Python 3.5.2

>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).

>>> print(xrange.__doc__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

差异显而易见。在Python2.x中,range返回一个列表,xrange返回一个可迭代的xrange对象。

在Python3.x中,range变为Python2.x的xrange,xrange被删除。

一定要花一些时间阅读图书馆参考资料。你越熟悉它,就越能更快地找到类似问题的答案。特别重要的是关于内置对象和类型的前几章。

xrange类型的优点是xrange对象总是使用相同数量的内存,无论它代表的范围大小如何。没有一致的性能优势。

另一种快速查找Python构造信息的方法是docstring和help函数:

print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)

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