第8章 合并分割IO与性能实战


文档摘要

第8章 · 合并分割IO与性能实战 本章要回答的三个问题:concatenate、stack、split 家族各自怎么选,合并为什么必然拷贝?npy、npz 与文本读写的速度和内存差异多大,内存映射怎么让大文件"边读边算"?把前面七章的内存知识串起来,一张性能清单能查出哪些常见慢代码? 为什么会有这一章 前七章都在操作"已经在内存里的数组",本章补上进出环节:多个数组拼成矩阵、大文件加载进内存。合并与分割全是拷贝操作(组合后的元素排列无法由单一 strides 描述),IO 的格式选择直接决定加载速度与内存峰值。最后一节是全册知识的综合应用:向量化改写实战加性能检查清单。

第8章 · 合并分割IO与性能实战

本章要回答的三个问题:concatenate、stack、split 家族各自怎么选,合并为什么必然拷贝?npy、npz 与文本读写的速度和内存差异多大,内存映射怎么让大文件"边读边算"?把前面七章的内存知识串起来,一张性能清单能查出哪些常见慢代码?

为什么会有这一章

前七章都在操作"已经在内存里的数组",本章补上进出环节:多个数组拼成矩阵、大文件加载进内存。合并与分割全是拷贝操作(组合后的元素排列无法由单一 strides 描述),IO 的格式选择直接决定加载速度与内存峰值。最后一节是全册知识的综合应用:向量化改写实战加性能检查清单。

读完能解决什么

  • 能按"沿旧轴还是新轴"选对 concatenate 与 stack,理解合并的必然拷贝
  • 能为数据选对存取格式:文本可读、npy 快、npz 压缩、memmap 破内存上限
  • 能把双重循环、逐行 append、重复计算三类慢代码改写成向量化版本
  • 拥有一张可复用的性能排查清单

各节怎么分工

回答哪个问题 关键产出
8.1 concatenate家族与split 拼与切的代价 轴选择决策 + 必然拷贝验证
8.2 npy二进制与内存映射 数据怎么进出 四种格式对比 + memmap 案例
8.3 向量化改写实战与性能清单 慢代码怎么救 三类改写模板 + 检查清单

本章知识点清单

  1. 能说出合并必然拷贝的原因,并解释循环合并的平方复杂度事故
  2. 能按"沿旧轴 concatenate、沿新轴 stack"选择拼接方式,并指出一维配 hstack 的反直觉
  3. 能用 split 按份数或按分割点切分,知道规则切分返回视图、array_split 兜底不均分
  4. 能用同一个排列同步洗牌特征与标签,完成训练验证测试三切分
  5. 能对比 txt、npy、npz、memmap 四种格式在速度、体积、内存峰值上的差异
  6. 能用 open_memmap 与分块累加模板处理超过内存的大文件统计
  7. 能完成蒙特卡洛案例的向量化改写,路径内依赖交给 cumprod 或 cumsum
  8. 能默写性能清单的三个层次:代码层五项、内存层五项、进出层两项
  9. 能用 perf_counter 加重复取最小值的方式验收每次优化

开读前三个疑问

问:合并和切分不就是拼拼拆拆,有什么代价可讲?
答:合并必产生整块新内存,循环里反复合并是平方复杂度事故;切分出的子块共享原内存,改子块会穿透原数组。两个方向都有真实的坑,8.1 节各配了案例。

问:为什么不直接存 csv,通用又直观?
答:直观是要付费的——文本解析比 npy 慢一到两个数量级,内存峰值还更高。中间结果用 npy、交付给人看才转文本,是数据管线的分工常识。

问:性能清单要按顺序逐条执行吗?
答:清单是排查顺序不是执行顺序。先跑通代码,再按"代码层、内存层、进出层"逐层打勾,命中的条目按对应章节方案改写、改一条测一条。

先决条件

  • 第 2 章视图拷贝(理解合并为何必然拷贝)
  • 第 6 章广播与 ufunc(向量化改写的工具)
  • 第 7 章聚合(性能案例里的替代写法)

往下走到哪

这是全册终点。走出本章,你应当能对任何一段 NumPy 代码说出"每个操作的内存代价",这个判断力会延伸到 Pandas、PyTorch 等一切建立在同构数组之上的工具。最后的性能清单建议打印或抄录,接下来一个月里每遇到慢代码就过一遍——清单的价值在使用中内化,不在阅读中。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U