显然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
返回一个对象(它的行为类似于生成器,虽然它肯定不是一个生成器),从中按需生成值。
何时使用哪个?
xrange
。range
。PS:Python 3.x的range
函数== Python 2.x的xrange
函数。
当参数较小时,range(..)
/ 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%。list(xrange(...))
将等同于range(...)
。list
很慢。xrange
确实没有完全完成序列。xrange
对象。范围:-范围将一次性填充所有内容,这意味着范围内的每个数字都会占用内存。
xrange:-xrange类似于生成器,当您想要数字范围但不想将它们存储在内存中时,就会出现它,例如在使用for循环时。因此具有内存效率。
当需要扫描/打印0-N个项目时,range和xrange的工作方式如下。
range() - 在内存中创建一个新列表,取整个0到N个项目(总共N+1个)并打印它们。 xrange() - 创建一个迭代器实例,通过项目进行扫描,并仅将当前遇到的项目保存在内存中,因此始终利用相同的内存量。
如果所需元素恰好位于列表的开头,则可以节省大量时间和内存。
xrange
不会创建一个迭代器实例。它创建了一个 xrange
对象,该对象是可迭代的,但不是迭代器——几乎(但并非完全)像列表一样的序列。 - abarnertRange 返回一个列表,而 xrange 返回一个xrange 对象,不考虑范围大小,该对象占用相同的内存。在这种情况下,每次迭代只生成并可用一个元素,而对于使用 range,所有元素一次性生成并在内存中可用。
xrange
不是一个迭代器。range
返回的列表支持迭代(列表几乎就是可迭代对象的典型例子)。 xrange
的整体优势并非“最小化”的。等等。 - abarnert
xrange(1000)
是一个像生成器一样的对象(尽管它确实不是一个生成器)。”(我强调的)。但即使它没有这么说,你也会相信一个随意的SO用户的评论,而不是官方的Python文档或者你自己测试得到的结果吗? - abarnert__iter__
返回一个新对象,它可以被索引,因为它有一个__getitem__
等等。生成器是一种在迭代时被消耗的东西,因为它的__iter__
返回self,它不能被索引,并且它包含一个暂停的堆栈帧,它有send
和throw
方法。xrange
听起来像哪一个? - abarnert