【问题标题】:Python range for multiple iteration用于多次迭代的 Python 范围
【发布时间】:2017-12-24 18:55:12
【问题描述】:

有人告诉我,如果您想多次迭代列表,最好使用 range。这是因为每次访问索引时 xrange 都必须生成一个整数对象,而 range 是一个静态列表,整数已经“在那里”可以使用。

所以,我推断 range 方法创建的列表保留在内存中,足以重新迭代。这份名单什么时候销毁?

【问题讨论】:

  • 当没有任何引用它时。附带说明一下,最好使用 Python 3。
  • 我很好奇 :)
  • 您是否有一个非常具体的用例需要回答这个问题?否则最好不要碰python的内存管理

标签: python


【解决方案1】:

在 Python 2 中,range(n) 返回从 0n-1 的数字列表。

如果你编码

for i in range(1000000):

然后您的程序会创建一个包含一百万个整数的列表,并在 for 语句结束时将其丢弃。该列表必须在内存中构建,如果您的代码经常这样做,这可能会很昂贵。

如果你编码

for i in xrange(1000000):

那么你的程序不会创建一百万个整数的列表:而是你得到一种迭代器。但它仍然会在for 语句的末尾被销毁。 xrange() 函数可以追溯到 Python 1,在该语言将迭代器作为第一类构造之前,但想法大致相同。它不是一个数据结构,而是一段代码,当你请求它时,它会返回下一个数字,而不是预先生成它们。

因此,您的推论“range 方法创建的列表保留在内存中足以重新迭代”是不正确的。 (虽然我认为你的意思是 xrange 而不是 range。不管怎样,都是错误的。)

如果您希望range() 生成的列表保留在内存中,请执行以下操作:

 myrange = range(1000000):

那你就可以了

for i in myrange:

只要您愿意,您只需支付一次创建一百万个整数列表的开销。

如果你的范围是几十或几百,而不是几百万,并且你需要问这个问题,那么你不应该为效率而烦恼。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多