显然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返回一个迭代器,每次只在内存中保留一个数字。范围将整个数字列表保存在内存中。
其他回答
请参阅本文,了解range和xrange之间的差异:
引用:
range返回您所认为的结果:连续列表整数,具有以0开头的定义长度。xrange,返回一个“xrange对象”,它的行为非常像迭代器
文件清楚地写道:
此函数与range()非常相似,但返回的是xrange对象而不是列表。这是一种不透明的序列类型,它产生与相应列表相同的值,而实际上没有同时存储所有值。xrange()相对于range()的优势很小(因为xrange)仍然需要在请求时创建值),除非在内存不足的机器上使用了非常大的范围,或者从未使用过范围的所有元素(例如,循环通常以break结束)。
range生成整个列表并返回它。xrange不——它根据需要生成列表中的数字。
一定要花一些时间阅读图书馆参考资料。你越熟悉它,就越能更快地找到类似问题的答案。特别重要的是关于内置对象和类型的前几章。
xrange类型的优点是xrange对象总是使用相同数量的内存,无论它代表的范围大小如何。没有一致的性能优势。
另一种快速查找Python构造信息的方法是docstring和help函数:
print xrange.__doc__ # def doc(x): print x.__doc__ is super useful
help(xrange)
记住,使用timeit模块测试哪一小段代码更快!
$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop
就我个人而言,我总是使用range(),除非我处理的是非常庞大的列表——正如你所看到的,从时间上看,对于一个百万条目的列表,额外的开销仅为0.04秒。正如Corey所指出的,在Python 3.0中,xrange()将消失,而range()无论如何都会给您带来不错的迭代器行为。