显然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):
当前回答
根据扫描/打印0-N项的要求,range和xrange的工作原理如下。
range()-在内存中创建一个新列表,并获取整个0到N个项目(总共N+1个)并打印它们。xrange()-创建一个迭代器实例,该实例扫描项目并只将当前遇到的项目保存在内存中,因此始终使用相同的内存量。
如果所需的元素只是在列表的开头,那么它可以节省大量的时间和内存。
其他回答
range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。
这给您带来了两个好处:
您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个生成器,因此它是一个序列对象。
这是正确的,但在Python3中,range()将由Python2xrange()实现。如果您需要实际生成列表,则需要执行以下操作:
list(range(1,100))
此外,if do list(xrange(…))将等同于range(…)。
所以列表很慢。
而且xrange确实没有完全完成序列
这就是为什么它不是一个列表,而是一个xrange对象
xrange返回一个迭代器,每次只在内存中保留一个数字。范围将整个数字列表保存在内存中。
一定要花一些时间阅读图书馆参考资料。你越熟悉它,就越能更快地找到类似问题的答案。特别重要的是关于内置对象和类型的前几章。
xrange类型的优点是xrange对象总是使用相同数量的内存,无论它代表的范围大小如何。没有一致的性能优势。
另一种快速查找Python构造信息的方法是docstring和help函数:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)