显然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):
当前回答
对于范围(..)/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返回一个列表。
什么range在运行时返回静态列表。xrange返回一个对象(其作用类似于生成器,尽管它肯定不是一个),在需要时从中生成值。
什么时候使用哪个?
如果你想为一个巨大的范围生成一个列表,比如10亿,特别是当你有一个“记忆敏感系统”,比如手机时,可以使用xrange。如果要在列表中重复多次,请使用范围。
PS:Python 3.x的range函数==Python 2.x的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)
xrange只存储范围参数并根据需要生成数字。然而,Python的C实现目前将其args限制为C longs:
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]
注意,在Python3.0中只有范围,它的行为类似于2.xxrange,但没有对最小和最大端点的限制。
每个人都对它进行了大量的解释。但我想让它自己看。我用蟒蛇。因此,我打开了资源监视器(在Windows!中),首先执行了以下命令:
a=0
for i in range(1,100000):
a=a+i
然后检查“正在使用”内存中的更改。这是微不足道的。然后,我运行了以下代码:
for i in list(range(1,100000)):
a=a+i
它立即占用了大量内存。我确信。你可以自己试试。
如果您使用的是Python 2X,那么在第一段代码中,将“range()”替换为“xrange()”,将“list(range())”替换成“range()”。