numpy比python列表快100倍以上,因其ndarray采用连续内存布局、类型单一且由c底层实现:列表存对象指针需逐个查类型和调方法,ndarray存原始字节(如float64),支持cpu批量加载与simd指令,运算绕过python解释器。

ndarray 的内存连续性、类型单一性和 C 底层实现,决定了它在科研场景中不是“更好用”,而是“不可替代”。
为什么 np.array 比 Python 列表快 100 倍以上?
关键不在“写法简洁”,而在内存和执行路径:
- Python 列表是对象指针数组,每个元素都要查类型、调方法、做引用计数;
ndarray所有元素存为连续的原始字节(如float64),CPU 可以直接批量加载到寄存器 -
np.add、np.multiply等函数调用的是底层优化过的 BLAS/LAPACK 或 SIMD 指令,不经过 Python 解释器 - 一个 100 万元素的向量加法,
list要执行 100 万次 Python 字节码,而ndarray是单次 C 函数调用 + 内存 memcpy
axis 参数为什么总让人填错?
不是概念抽象,而是维度索引和人类直觉反着来:
-
axis=0意味着“沿着第 0 轴压缩”,也就是对行操作(结果变矮),不是“处理第 0 行” - 二维数组
arr.shape == (100, 5):np.sum(arr, axis=0)输出 shape(5,),axis=1输出(100,) - 容易踩坑:广播时
axis不匹配会静默失败,比如arr_2d + arr_1d依赖arr_1d的 shape 是否能对齐最后一维
NumPy 2.0 的 __array_function__ 协议到底改了什么?
不是语法变化,而是让 scipy、xarray 这类库能真正“插进” NumPy 的调用链:
- 以前
scipy.fft.fft(arr)返回的是普通 ndarray;现在它可返回自定义数组类型(如带单位的 Quantity),且仍能被np.abs()、np.mean()正常调用 - 如果你写自定义数组类,必须实现
__array_function__,否则遇到np.concatenate就报TypeError: no implementation found - NumPy 2.x 默认启用该协议,但 1.24+ 也支持 —— 关键是下游库是否适配,不是你升级 NumPy 就自动生效
np.linspace”,而是没意识到 np.array([1, 2, 3]) 默认 dtype 是 int64,而 np.array([1., 2., 3.]) 才是 float64;浮点精度丢失、整数溢出、跨平台 dtype 不一致,这些细节在论文复现和集群批量跑任务时才暴露。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











