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

Numpy视图内存占用疑问:视图存储指针还是浮点对象?

Numpy视图相关疑问解答

一、Numpy视图是存储指针还是浮点对象?

  • Numpy视图不存储实际的浮点(或其他类型)数据对象,它本质是个轻量级的ndarray对象,核心存的是:
    • 指向原数组底层数据缓冲区的指针
    • 自身的形状、步长、数据类型等元信息
  • 视图和原数组共享同一块内存缓冲区,对视图的修改会直接同步到原数组,这就是@juanpa提到的“共享底层缓冲区”,也就是你理解的按引用传递。

二、滑动窗口视图与副本的内存差异问题

代码场景

你用到的滑动窗口视图代码:

import numpy as np
arr = np.lib.stride_tricks.sliding_window_view(
    np.arange(510), 50, axis=0
)

内存差异的核心原因

  1. .nbytes的计算逻辑:
    • .nbytes算的是数组所有元素的总字节数,不管数据是不是共享的。滑动窗口视图有510-50+1=461个窗口,每个窗口50个int元素(按int64算,每个8字节),总字节数是461*50*8=184400,和副本的元素总字节数一致,所以返回值相同。
  2. sys.getsizeof()的计算逻辑:
    • sys.getsizeof()只算Python对象自身占用的内存,不包含它引用的底层数据缓冲区。
    • 滑动窗口视图只是个持有元数据(指针、形状、步长等)的轻量对象,所以大小只有128字节左右。
    • 副本是独立的ndarray,会重新分配内存存储所有元素,sys.getsizeof()会把这些元素的内存加上对象元数据的大小一起算,所以总大小达到184528字节。
  3. 关于只读特性:滑动窗口视图默认只读是为了避免步长不连续导致的写入错误,但这不影响它共享原缓冲区的本质。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:35:25