第2章 · 内存布局三讲 本章要回答的三个问题:strides 步长除了定位元素,还会影响什么?C 序和 F 序到底是什么、什么时候必须关心?为什么有的操作返回视图、有的返回拷贝,界线画在哪里? 为什么会有这一章 第 1 章末尾你已经见过"转置只换 strides 不动数据"。这引出三个绕不开的问题。其一,strides 不规整的数组(比如转置后的),运算会不会变慢?其二,有些库(早期版本的部分图像与线代代码)只吃 C 序或 F 序连续数组,传错了直接报错,怎么判断与转换?其三,也是最重要的:视图与拷贝的分界——同一个 arr[...],写法差一个字符,内存行为天差地别,这是 NumPy 最经典的 bug 来源。 本章三节依次回答:步长、连续性、视图与拷贝。
本章要回答的三个问题:strides 步长除了定位元素,还会影响什么?C 序和 F 序到底是什么、什么时候必须关心?为什么有的操作返回视图、有的返回拷贝,界线画在哪里?
第 1 章末尾你已经见过"转置只换 strides 不动数据"。这引出三个绕不开的问题。其一,strides 不规整的数组(比如转置后的),运算会不会变慢?其二,有些库(早期版本的部分图像与线代代码)只吃 C 序或 F 序连续数组,传错了直接报错,怎么判断与转换?其三,也是最重要的:视图与拷贝的分界——同一个 arr[...],写法差一个字符,内存行为天差地别,这是 NumPy 最经典的 bug 来源。
本章三节依次回答:步长、连续性、视图与拷贝。讲完之后,第 4、5 章的索引与形状操作就只是本章原理的应用题。
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 2.1 步长strides如何定位每个元素 | 步长还影响什么 | 访问模式与缓存的关系实验 |
| 2.2 C序F序与连续性检测 | 两种排列顺序怎么用 | flags 检测与 ascontiguous 转换 |
| 2.3 视图与拷贝的分界线 | 哪些操作动内存 | 操作分类速查 + shares_memory 验证法 |
问:这一章会不会太底层?
答:恰好相反,它是全书最"实用"的一章——视图与拷贝的分界直接决定了你写的代码会不会出 bug,连续性直接决定了快与慢。后面四章的每个结论都能追溯到本章。
问:CPU 缓存是什么,要先学体系结构吗?
答:不需要。本册只用一个事实:内存按块搬进高速缓存,顺序访问能一次用完整块,跳跃访问浪费带宽。把它当"图书馆按书架取书"理解即可。
问:flags 和 shares_memory 要背吗?
答:不用背,要练。每个新操作都顺手打一次这两样,一周就能形成肌肉记忆,比背速查表可靠。
本章的"视图与拷贝"尺子会在第 4 章(索引切片)与第 5 章(形状操作)被反复使用,也是第 8 章性能实战的理论基础。可以说后面所有章节都在消耗本章建立的概念红利。