np.var()和np.mean()本身极快,慢因误用:list转array、循环调用、混用python/pandas方法、axis未指定、ddof默认错误、nan未处理等。

np.var() 和 np.mean() 本身不慢,慢在你没用对
直接调 np.var() 或 np.mean() 是极快的——它们底层是 C 实现、单趟扫描、自动向量化。真正拖慢的,是这些操作前后的“多余动作”:
- 把
list反复转成np.array:每次np.array(my_list)都触发内存拷贝和类型推断 - 在循环里反复调用:比如
for row in data: np.mean(row),失去向量化意义 - 混用
statistics.variance()或手写sum((x - m)**2 for x in lst) / n:纯 Python 循环 + 两趟遍历,百万元素上比np.var()慢 20 倍以上 - 用
pd.Series(data).var()处理纯数值数组:Pandas 构造 Series 开销远大于 NumPy 数组,尤其小数组
axis 参数不设等于白算,二维数组默认展平
二维数组 arr.shape == (1000, 50) 调 np.var(arr) 不是按列算 50 个方差,而是把全部 5 万个数当一个一维数组算——结果是个标量。这常导致后续逻辑出错,又回头 debug。
- 按列(每列一个方差):用
np.var(arr, axis=0)→ 返回 shape=(50,) 的数组 - 按行(每行一个方差):用
np.var(arr, axis=1)→ 返回 shape=(1000,) 的数组 - 想同时得均值和方差?直接写
np.mean(arr, axis=0), np.var(arr, axis=0),NumPy 内部不会重复遍历 - 别用
arr.mean(axis=0)混着 Pandas 写法——ndarray 没这个方法,会报AttributeError
ddof=1 不是可选,是统计学硬要求
样本方差必须除以 n-1,不是 n。NumPy 默认 ddof=0(总体方差),Pandas 默认 ddof=1(样本方差)。混用不加参数,结果能差 10% 以上。
- 做描述性统计、模型输入、训练前标准化:一律显式写
ddof=1 -
np.std(arr, ddof=1)**2和np.var(arr, ddof=1)理论等价,但后者更稳——前者因浮点误差可能略大 - 如果
arr是整型(如int64)且n==1,ddof=1会触发除零,返回nan或inf;提前加判断或转成float64 - 别靠“先 std 再平方”偷懒,除非你确认两个函数的
ddof和dtype完全一致
NaN 存在时,np.var() 直接返回 nan,不是忽略
只要数组里有一个 np.nan,np.var(arr) 就返回 nan,连警告都不给。这不是 bug,是设计:它强制你面对缺失值问题。
- 真要跳过 NaN:改用
np.nanvar(arr, ddof=1),但它对整型数组会静默转为 float,注意 dtype 变化 - 检查有没有 NaN:
np.isnan(arr).any(),比pd.isna().any()快得多,且不依赖 Pandas - 填充再算?小心:用
np.where(np.isnan(arr), fill_val, arr)比arr[np.isnan(arr)] = fill_val更安全(避免原地修改副作用) - 别用
arr[~np.isnan(arr)]切片后计算——这会新建数组,内存翻倍,大数组慎用
最常被忽略的其实是数据流向:从读取、清洗、到统计,每一步的中间表示是否仍是 ndarray。一旦掉进 list → loop → statistics → list 这个链路,加速就无从谈起。保持全程 NumPy 类型,axis 和 ddof 显式声明,NaN 处理前置——剩下的就是毫秒级响应。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











