显然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在运行时返回静态列表。xrange返回一个对象(其作用类似于生成器,尽管它肯定不是一个),在需要时从中生成值。
什么时候使用哪个?
如果你想为一个巨大的范围生成一个列表,比如10亿,特别是当你有一个“记忆敏感系统”,比如手机时,可以使用xrange。如果要在列表中重复多次,请使用范围。
PS:Python 3.x的range函数==Python 2.x的xrange函数。
其他回答
range生成整个列表并返回它。xrange不——它根据需要生成列表中的数字。
Range返回一个列表,而xrange返回一个xrange对象,该对象占用相同的内存,而不考虑范围大小,因为在这种情况下,每次迭代只生成一个元素并可用,而在使用Range的情况下,所有元素都会一次生成并在内存中可用。
一定要花一些时间阅读图书馆参考资料。你越熟悉它,就越能更快地找到类似问题的答案。特别重要的是关于内置对象和类型的前几章。
xrange类型的优点是xrange对象总是使用相同数量的内存,无论它代表的范围大小如何。没有一致的性能优势。
另一种快速查找Python构造信息的方法是docstring和help函数:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
range:-range将一次填充所有内容。这意味着范围中的每个数字都将占用内存。
xrange:xrange有点像生成器,当你想要数字的范围,但你不希望它们被存储时,它就会出现在图片中,就像你想使用for loop时一样。
这是出于优化的原因。
range()将创建从开始到结束的值列表(示例中为0..20)。这将成为非常大范围的昂贵操作。
另一方面,xrange()更为优化。它只会在需要时(通过xrange序列对象)计算下一个值,不会像range()那样创建所有值的列表。