范围大时“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
快得多,除了短 range
s。那里range
快一点。
非常感谢您的详细解释!!!
@goodvibration 我用我的时间创建了一个gist,如果你愿意,你可以自己试验一下:)以上是关于范围大时“for / range”会不会消耗大量内存? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 executeFetchRequest 消耗大量内存