python 3 的 range 是内存恒定、o(1)操作的数学抽象序列,而 python 2 的 range 立即生成完整列表易致 memoryerror,xrange 虽惰性但功能残缺;真正爆内存的是显式展开(如 list(range(n))),而非 range 本身。

Python 2 的 range 在超大范围下会直接爆内存,Python 3 的 range 几乎不占内存且多数操作是 O(1),差异不是“快慢问题”,而是“能不能跑起来”的问题。
Python 2 的 range 立刻分配完整列表
它本质是 list(range(n)) 的快捷写法,调用即生成全部整数对象。
-
range(10**7)在 Python 2 中会尝试分配含一千万个int的列表,轻松吃掉 80MB+ 内存,线上服务常因此触发MemoryError - 哪怕只做
len(range(10**8)),也得先把整个列表建出来再取长度——纯浪费 - 类型上就是
list,支持切片、索引、+拼接等,但代价是内存和初始化时间线性增长
Python 2 的 xrange 是惰性迭代器,但功能残缺
它解决了内存问题,却牺牲了语义表达力和算法效率。
python-docx Skill功能概述python-docx Skill是一项面向实际任务的技能,主要用于本Skill提供使用python-docx生成专业Word文档的标准方法和最佳实践;生成安全服务方案文档;核心要点生成技术架构设计文档;生成任何需要专业排版的Word文档;核心库 : python-docx;使用与执行辅助库 : docx.shared , docx.enum , docx.oxml.ns;标准代码模板;1. 文档初始化;2. 字体设置(必须!它将相关步骤、工具调用和结果整理方式集
-
xrange(10**15)内存恒定(几百字节),但不支持切片:xrange(10)[2:5]直接抛TypeError -
999 in xrange(1000)是 O(n) 线性扫描,最坏比 1000 次;而 Python 2 的range更糟:先造列表再查in - 没有溢出防护:
xrange(2**63)可能静默截断或崩溃,不像 Python 3 的range明确抛OverflowError
Python 3 的 range 是数学抽象的不可变序列
它既不是生成器,也不是迭代器,而是一个靠公式推导行为的轻量对象。
-
sys.getsizeof(range(10))和sys.getsizeof(range(10**15))都约 48 字节——只存start、stop、step三个整数 -
10**12 in range(10**12 + 1)是 O(1) 数学判断:检查(n - start) % step == 0且落在区间内,不生成、不迭代 -
range(0, 100, 2)[5:15:2]返回新range(10, 30, 4),仍是恒定内存,不是拷贝也不是列表 - 支持
==比较(按参数逻辑相等)、负索引、reversed()、pickle(3.2+),但isinstance(range(10), collections.Iterator)是False
真正爆内存的从来不是 range,而是你主动展开它
几乎所有性能误判都源于混淆“range 对象”和“range 展开结果”。
-
for i in range(10**6): ...安全——Python 3 里这行代码本身不占额外内存 -
list(range(10**6))危险——立刻退化成 Python 2 的range行为,分配百万整数对象 -
print(range(1000))看似无害,但__repr__可能触发部分展开(小范围安全,大范围可能卡住) - 第三方库如
numpy.arange或某些 ORM 的in查询若内部调用list(),也会绕过range的优势
关键分水岭不在写法,而在你是否在某处悄悄调用了 list()、tuple()、json.dumps() 或其他强制展开的操作——那些才是内存爆炸的真正开关。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










