第1章 内存视角看NumPy


文档摘要

第1章 · 内存视角看NumPy 本章要回答的三个问题:同样是存一千万个数,为什么 Python 列表又慢又费内存、NumPy 数组却快得多?ndarray 到底由哪几块东西组成?装好环境之后,我该从哪个属性开始"看"一个数组? 为什么会有这一章 几乎每本 NumPy 教材开头都说"NumPy 很快,因为它是 C 写的"。这话对,但没用——它解释不了为什么切片一个数组改的是原数组,解释不了为什么 dtype 不对会静默丢数据,更解释不了为什么有人 transpose 之后代码反而变慢。快不快的根源不在"用什么语言写的",而在数据在内存里怎么摆。 列表里存的是一个个对象的地址,地址指向的东西散落在堆的各处;ndarray 是一整块连续内存,元素一个挨一个躺着。

第1章 · 内存视角看NumPy

本章要回答的三个问题:同样是存一千万个数,为什么 Python 列表又慢又费内存、NumPy 数组却快得多?ndarray 到底由哪几块东西组成?装好环境之后,我该从哪个属性开始"看"一个数组?

为什么会有这一章

几乎每本 NumPy 教材开头都说"NumPy 很快,因为它是 C 写的"。这话对,但没用——它解释不了为什么切片一个数组改的是原数组,解释不了为什么 dtype 不对会静默丢数据,更解释不了为什么有人 transpose 之后代码反而变慢。快不快的根源不在"用什么语言写的",而在数据在内存里怎么摆

列表里存的是一个个对象的地址,地址指向的东西散落在堆的各处;ndarray 是一整块连续内存,元素一个挨一个躺着。这个差别是全书所有内容的起点,本章用两节把它讲透:第一节做实验,亲手量出列表与数组的差距;第二节拆开 ndarray,认识它的三要素。

读完能解决什么

  • 能用实验数据(时间、内存占用)向别人解释"为什么选 ndarray"
  • 拿到任何数组,能一眼读出它的 shape、dtype、itemsize、nbytes 分别说明什么
  • 环境装好,后续每一章的实验都能直接跑

各节怎么分工

回答哪个问题 关键产出
1.1 为什么Python列表跑不快 性能差距从哪来 列表 vs 数组的计时与内存实验
1.2 ndarray的三要素 数组由什么构成 内存示意图 + 三要素解读套路

本章知识点清单

读完本章,以下知识点应当达到"能向别人讲清楚"的程度,每条都可以在代码里当场验证:

  1. 能说出 Python 列表存储一个整数的两层开销:指针数组加 PyObject 对象本身
  2. 能用 sys.getsizeof 与 ndaray 的 nbytes 分别量出同规模列表与数组的内存占用,并解释三倍差距的来源
  3. 能复现"千万元素乘二"计时实验,并解释向量化为什么快(连续内存、缓存命中、无装箱)
  4. 能默写 ndarray 三要素:dtype、shape、strides 各自的含义与单位
  5. 能手算 2×3 int64 数组中 a[1,2] 元素的字节偏移(下标乘步长求和)
  6. 能解释为什么转置只改 strides 不动数据,并用 shares_memory 验证
  7. 养成"读片四件套"习惯:拿到数组先打印 shape、dtype、strides、itemsize

开读前三个疑问

问:不学内存原理,直接背 API 不行吗?
答:能应付小数据,但一旦数据上千万行,"为什么这段慢""为什么内存爆了""为什么原数组被改了"这类问题会密集出现,而它们的答案全在布局里。与其每次事故查论坛,不如一次学透。

问:C 语言基础需要吗?
答:完全不需要。本册讲的"内存"只到"连续字节块加描述字段"这一层,配上图解就能建立模型,不涉及指针语法或编译细节。

问:实验数据在我的机器上不一样怎么办?
答:不一样才是正常的——计时受硬件影响,但结论方向(倍数差距、共享内存与否)在所有机器上一致。关注结论而非具体毫秒数。

先决条件

  • 会 Python 基础语法:列表、for 循环、函数调用
  • 装好 Python 3.8 以上环境;没装 NumPy 的话 1.1 节给出一条命令的安装方式
  • 不需要任何线性代数或 C 语言背景

往下走到哪

本章结束时你看到的还只是"数组是一块连续内存加几个描述字段"。第 2 章会继续深入这块内存:元素如何被定位(步长)、两种摆放顺序(C 序与 F 序)、以及贯穿全书的那把尺子——视图还是拷贝。


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