协慌网

登录 贡献 社区

Python 2.X 中的 range 和 xrange 函数之间有什么区别?

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

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

答案

在 Python 2.x 中:

  • range创建一个列表,因此,如果执行range(1, 10000000)它将在内存中创建一个包含9999999元素的列表。

  • xrange是一个懒惰求值的序列对象。

在 Python 3 中:

  • range等效于 Python 2 的xrange 。要获取列表,您必须显式使用list(range(...))
  • xrange不再存在。

range 创建一个列表,因此,如果执行range(1, 10000000)它将在内存中创建一个包含9999999元素的列表。

xrange是一个生成器,因此它是一个序列对象,是一个懒惰求值的对象。

的确如此,但是在 Python 3 中, range()将由 Python 2 xrange() 。如果需要实际生成列表,则需要执行以下操作:

list(range(1,100))

记住,请使用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()仍将为您提供良好的迭代器行为。