范围大时“for / range”会不会消耗大量内存? [复制]

Posted

技术标签:

【中文标题】范围大时“for / range”会不会消耗大量内存? [复制]【英文标题】:Does "for / range" consume a lot of memory when the range is large? [duplicate] 【发布时间】:2017-12-21 23:36:55 【问题描述】:

我担心的是:

for i in range(1000000000):
    ...

从幼稚的角度来看,我假设一个 1000000000 个整数的数组在循环开始之前被分配和初始化,只有在循环结束后才被释放。

所以我想知道是否应该将其替换为:

i = 0
while i < 1000000000:
    ...
    i += 1

但根据this answer,for 循环的执行速度比等效的while 循环快。

那么我是否必须接受这种权衡,或者我上面的假设是错误的,并且在迭代大型 range 时没有显着的内存影响?

【问题讨论】:

@mkrieger1:我的问题是“范围是否消耗内存”,而不是“范围和 xrange 之间有什么区别”。所以根据定义,这两个问题不能重复。这两个答案可能是,因此您可以将它们标记为重复。 @khelwood:我的问题是“范围是否消耗内存”,而不是“范围和 xrange 之间有什么区别”。所以根据定义,这两个问题不能重复。这两个答案可能是,因此您可以将它们标记为重复。 @Jean-François Fabre:我的问题是“范围是否消耗内存”,而不是“范围和 xrange 之间有什么区别”。所以根据定义,这两个问题不能重复。这两个答案可能是,因此您可以将它们标记为重复。 清嗓子 ***.com/questions/45129146/… 三遍完全相同的评论具有讽刺意味。 :D 【参考方案1】:

是的,在 python-2.x 中 range 将创建整个列表。

但您不一定需要while 循环,您也可以使用lazy-range-alternative:xrange

for i in xrange(1000000000):
    ...

【讨论】:

太好了,谢谢。但这不会像while 循环那样最终影响性能吗? @goodvibration:for i in xrange 可能会比while 稍微快一点,但差异会很小。一般来说,对于短列表,range 会比xrange 快,但会使用更多内存。如果您经常重复使用列表,它只会明显更快,因为xrange 将始终动态生成元素,而您可以多次重复使用来自range 的列表,它只是一个列表。在某些时候,内存使用将达到xrange 无论如何都更快的程度。而对于大多数目的来说,无论哪种方式,差异都很小, @goodvibration 根据我的经验,xrange 将比 range 快,并且比 while 快得多,除了短 ranges。那里range 快一点。 非常感谢您的详细解释!!! @goodvibration 我用我的时间创建了一个gist,如果你愿意,你可以自己试验一下:)

以上是关于范围大时“for / range”会不会消耗大量内存? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++11-范围for(range for)

核心数据 executeFetchRequest 消耗大量内存

ulimit

(第三章,第四章)http报文内的http信息,返回结果的http状态码

导出大量数据

Nginx