应优先使用itertools.chain合并可迭代对象以实现零拷贝惰性连接,配合islice切片大生成器、groupby前先排序、用生成器表达式替代嵌套map/filter,并注意一次性迭代器特性。

用 itertools.chain 合并多个可迭代对象,避免临时列表开销
当你要把多个 list、generator 或 map 结果拼成一个流式序列时,别写 sum([a, b, c], []) 或 a + b + c —— 这会触发多次内存拷贝和新列表分配。用 itertools.chain 是零拷贝的惰性连接。
-
itertools.chain(a, b, c)返回迭代器,不立即展开任何内容 - 适用于嵌套结构展平:比如
itertools.chain.from_iterable(nested_lists)比双重for更简洁 - 注意:不能对
chain对象重复遍历(它是一次性的),需要多次用就包一层list()或用itertools.tee
用 itertools.groupby 前必须先排序,否则分组失效
itertools.groupby 只对连续相同键的元素分组,不是全量聚合。常见错误是直接对无序数据调用,结果每组只有一两个元素,还以为函数坏了。
- 正确做法:先按分组键排序,再
groupby,例如sorted(items, key=lambda x: x['category'])→groupby(..., key=lambda x: x['category']) - 如果原始数据已按某字段有序(如数据库按时间查出),可跳过排序,但得确认顺序可靠
- 返回的是
(key, group_iterator)元组,group_iterator也是一次性的,要转list再用就得立刻消费
用 itertools.islice 替代切片大生成器,防止内存爆炸
对 range(10**9) 或文件逐行生成器做 [1000:2000] 切片?Python 会尝试构建完整中间序列——直接 OOM。用 islice 是唯一安全方式。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
itertools.islice(iterator, start, stop, step)完全惰性,跳过前start项后才开始产出,不缓存已跳过项 - 不能反向索引(不支持负数
start或stop) - 和普通切片不同:它不支持
len(),也不能用in检测成员,仅用于“取一段”场景
组合多个 itertools 工具时,优先用生成器表达式补位,别硬套嵌套 map
itertools 的函数大多返回迭代器,但组合时容易写出难以调试的嵌套调用,比如 map(lambda x: x*2, filter(..., chain(...)))。可读性和调试成本陡增。
立即学习“Python免费学习笔记(深入)”;
- 推荐用生成器表达式替代内层
map/filter:例如(x*2 for x in itertools.chain(a, b) if x > 0) -
itertools.compress、itertools.dropwhile等有明确语义的函数保留,它们比手写循环更意图清晰 - 注意:混用生成器和
itertools函数时,整个链路仍是一次性迭代器,调试时用itertools.tee分流,但别滥用(会额外内存)

















