为何Python语句ordered_tuple = tuple(range(10**9))会导致电脑卡顿?
为什么
tuple(range(10**9))会导致电脑卡顿? 核心原因就是内存被彻底占满,触发了系统的硬盘页面交换:
range本身是惰性生成的序列,几乎不占内存,但tuple()会强制把range里的所有元素一次性加载到内存里。- 算笔账:109个整数,在64位Python中,每个整数对象至少要占28字节(就算只算对象引用,64位系统下每个引用是8字节,109个就是8GB,已经超过很多笔记本的内存了)。实际内存占用只会更高,直接超出普通笔记本的内存上限(一般8-16GB)。
- 当物理内存不够用的时候,系统会把内存里的部分数据临时写到硬盘的虚拟内存分区里,这个过程叫页面交换。但硬盘的读写速度比内存慢几百上千倍,电脑自然就会卡顿、响应迟缓,内存占用率也会直接冲到100%。
至于108及以下能正常运行,是因为108个整数的内存需求大概在2.8GB左右,这个量在大多数笔记本的内存承受范围内,不需要触发页面交换,所以不会卡顿。
建议
- 非必要的话,别把超大
range转成tuple,直接用range就行——它支持迭代、索引等绝大多数序列操作,而且几乎不占内存。 - 如果必须处理这类超大序列,改成分批次处理,每次只加载一小部分数据到内存里。
内容的提问来源于stack exchange,提问作者dark horse
相关产品推荐
相关产品推荐

