第8章 · 合并分割IO与性能实战 本章要回答的三个问题:concatenate、stack、split 家族各自怎么选,合并为什么必然拷贝?npy、npz 与文本读写的速度和内存差异多大,内存映射怎么让大文件"边读边算"?把前面七章的内存知识串起来,一张性能清单能查出哪些常见慢代码? 为什么会有这一章 前七章都在操作"已经在内存里的数组",本章补上进出环节:多个数组拼成矩阵、大文件加载进内存。合并与分割全是拷贝操作(组合后的元素排列无法由单一 strides 描述),IO 的格式选择直接决定加载速度与内存峰值。最后一节是全册知识的综合应用:向量化改写实战加性能检查清单。
本章要回答的三个问题:concatenate、stack、split 家族各自怎么选,合并为什么必然拷贝?npy、npz 与文本读写的速度和内存差异多大,内存映射怎么让大文件"边读边算"?把前面七章的内存知识串起来,一张性能清单能查出哪些常见慢代码?
前七章都在操作"已经在内存里的数组",本章补上进出环节:多个数组拼成矩阵、大文件加载进内存。合并与分割全是拷贝操作(组合后的元素排列无法由单一 strides 描述),IO 的格式选择直接决定加载速度与内存峰值。最后一节是全册知识的综合应用:向量化改写实战加性能检查清单。
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 8.1 concatenate家族与split | 拼与切的代价 | 轴选择决策 + 必然拷贝验证 |
| 8.2 npy二进制与内存映射 | 数据怎么进出 | 四种格式对比 + memmap 案例 |
| 8.3 向量化改写实战与性能清单 | 慢代码怎么救 | 三类改写模板 + 检查清单 |
问:合并和切分不就是拼拼拆拆,有什么代价可讲?
答:合并必产生整块新内存,循环里反复合并是平方复杂度事故;切分出的子块共享原内存,改子块会穿透原数组。两个方向都有真实的坑,8.1 节各配了案例。
问:为什么不直接存 csv,通用又直观?
答:直观是要付费的——文本解析比 npy 慢一到两个数量级,内存峰值还更高。中间结果用 npy、交付给人看才转文本,是数据管线的分工常识。
问:性能清单要按顺序逐条执行吗?
答:清单是排查顺序不是执行顺序。先跑通代码,再按"代码层、内存层、进出层"逐层打勾,命中的条目按对应章节方案改写、改一条测一条。
这是全册终点。走出本章,你应当能对任何一段 NumPy 代码说出"每个操作的内存代价",这个判断力会延伸到 Pandas、PyTorch 等一切建立在同构数组之上的工具。最后的性能清单建议打印或抄录,接下来一个月里每遇到慢代码就过一遍——清单的价值在使用中内化,不在阅读中。