You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NumPy数组是否真的比Python列表内存占用低?为何两种计算结果不一致

结论前置

你观察到的矛盾是对sys.getsizeof的统计范围理解偏差导致的,不属于操作错误,sys.getsizeof也可以用于统计NumPy数组的内存,只要区分清楚统计对象的构成即可。

核心原理:sys.getsizeof的统计规则

sys.getsizeof仅统计Python对象自身直接占用的内存,不会递归计算该对象引用的其他外部对象的内存开销。

两种结构的内存构成差异
  • 你测试得到的Python列表80字节占用,仅包含两部分:空列表本身的56字节结构体,加上3个指向int对象的指针(64位系统每个指针占8字节,共24字节),完全没有统计2、55、87这三个int实例的内存。Python中每个int对象在64位系统至少占用28字节,3个int就需要84字节,加上列表本身的80字节,总内存开销达到164字节,远高于NumPy数组的116字节。
    注:示例用到的小整数属于Python常驻缓存的对象,不会额外分配内存,但如果是大整数、浮点数或者自定义类型的元素,每个元素的独立内存开销会真实产生,总占用会更高
  • NumPy数组的116字节sys.getsizeof结果,是「数组元数据 + 元素数据缓冲区」的总占用:其中104字节是空NumPy数组的固定元数据开销,用来存储数组的dtype、shape、ndim、strides等核心属性,以及指向数据缓冲区的指针等结构,这就是你观察到空NumPy数组比空列表多占的空间;剩下的12字节就是narray.size * narray.itemsize统计的元素数据本身的存储空间,这部分是连续存储的,没有额外对象开销。
内存对比的正确姿势
  • 如果要对比相同规模数据的存储效率,用narray.size * narray.itemsize和「Python列表总占用(列表本身内存+所有元素的内存和)」对比是公平的,这种场景下NumPy数组的优势非常明显,数据量越大,元数据的固定开销占比越低,存储效率优势越突出。
  • sys.getsizeof可以直接用来统计数值型NumPy数组的总内存占用(因为数值型数组的元素直接存在自带的连续缓冲区里,没有额外引用的外部对象);但如果是NumPy对象数组,sys.getsizeof同样不会统计指针指向的外部对象内存,和Python列表的统计逻辑一致。

内容的提问来源于stack exchange,提问作者KnowledgeSeeeker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:15:03