网易首页 > 网易号 > 正文 申请入驻

Python:缓冲区协议

0
分享至

缓冲区协议是 Python 在对象底层进行数据共享的隐形纽带,它允许不同对象直接访问同一块内存,而无需复制,从而在性能与灵活性之间取得平衡。

一、什么是缓冲区协议

缓冲区协议(Buffer Protocol)是 Python 官方定义的底层对象协议,用于让不同对象安全、高效地共享底层的原始内存数据(raw memory buffer)。

换句话说,如果一个对象内部以二进制形式保存数据(例如字节数组、图像像素、数值矩阵),它可以通过缓冲区协议将这块内存“暴露”出来,让其他对象在不复制的前提下直接读取或修改。

这种机制在高性能计算、图像处理和科学计算中尤为重要。

、、 模块、 等都依赖该协议实现所谓的 “零拷贝”(zero-copy) 数据共享。

二、内存共享的核心思想

一般情况下,Python 对象之间传递数据时都会产生复制。

例如:

c = bytes(b)

此时 c 会创建一个新的内存副本。

但如果通过缓冲区协议,一个对象可以直接提供对自己底层内存的访问权限,这样另一个对象就能在原地读取或修改数据。例如:

print(data)  # 输出:bytearray(b'python')

是缓冲区导出者(exporter),它提供底层内存。

是缓冲区消费者(consumer),它使用该内存。

两者直接共享同一片内存,没有数据复制。

三、缓冲区协议的底层机制

在 C API 层面,缓冲区协议由几个结构与回调函数组成。

1、Py_buffer 结构体

该结构体定义了缓冲区的信息,包括:

• 指针(buf)

• 元素大小(itemsize)

• 维度数(ndim)

• 形状(shape)

• 步幅(strides)

• 数据格式(format)

• 以及只读/可写标志等。

这就是内存共享的“地图”。

2、核心接口

在 C 层定义于 PyBufferProcs 结构中:

• bf_getbuffer()

当外部对象请求访问缓冲区时调用,填充一个 Py_buffer 结构体。

• bf_releasebuffer()

当外部释放访问权限时调用,用于清理或减少引用计数。

这些接口不会在 Python 层直接暴露,是由底层类型(如 bytes、bytearray、array.array)自动实现。

Python 层用户一般通过 memoryview() 来间接使用这套机制。

四、memoryview:缓冲区的安全窗口

memoryview 是 Python 提供的对缓冲区协议的高级封装。

它提供一个高层、类型安全的接口,可以在不复制数据的前提下查看、切片、修改或转换底层内存。

示例:

print(a)             # 输出 array('h', [1000, 5000, 3000])

memoryview 不会创建新数组,它只是访问原数组的底层内存。因此对 m 的修改会直接反映在 a 中。

此外,memoryview 支持:

• 多维数组访问(例如二维 NumPy 数组的子视图)。

• 格式化描述符(如 'B', 'h', 'f'),用来表示底层数据类型。

• 切片与转置,都不会导致复制。

五、支持缓冲区协议的典型对象

Python 中常见的缓冲区导出者包括:

bytes:不可变的字节序列,只能被读取。

bytearray:可变字节序列,可以原地修改。

array.array:类型化的数值数组。

memoryview:缓冲区的通用访问接口。

numpy.ndarray: 的多维数组(C 层实现)。

PIL.Image: 的图像对象,可将像素缓冲区直接暴露给 NumPy。

这些对象均能导出底层内存,从而在科学计算、图像处理或流媒体处理中实现零拷贝共享。

六、零拷贝共享示例

下面演示 NumPy 与 Pillow 之间如何通过缓冲区协议共享数据:

print(img.size)  # 输出 (100, 100)

在这里,Image.frombuffer() 并没有复制 NumPy 数组的数据,而是直接读取其底层内存,实现了真正的 零拷贝数据交换。

七、使用建议与注意事项

1、首选 memoryview

这是 Python 层官方推荐的方式,既能访问底层内存,又能保持类型安全。

2、避免无意义的复制

若仅需访问数据,应使用 memoryview(data) 而非 bytes(data),因为后者会复制整个内存。

3、保持导出者的生命周期

在共享内存期间,必须确保原对象未被销毁,否则内存访问将无效。

4、理解可变与不可变对象的区别

bytes 对象是只读的,尝试写入会触发 TypeError;而 bytearray 是可变的。

八、缓冲区协议在 Python 体系中的位置

缓冲区协议是 Python 对象模型中的底层协议。

它与迭代协议、序列协议、容器协议等处于同一层级,但职责完全不同:

协议

作用

定义如何逐项访问对象内容

定义对象的存取与长度操作

定义算术与逻辑运算

缓冲区协议定义如何访问对象的底层内存表示

它没有对应的 Python 魔术方法(如 __iter__()、__getitem__() 之类),因为缓冲区协议是仅存在于 C API 层的接口,由解释器在底层处理,对普通 Python 用户来说是“透明”的。

小结

缓冲区协议是 Python 对象系统中一项极为关键的基础设施。

它让对象之间能够共享底层内存,从而避免数据复制,为高性能计算、图像处理、科学计算等场景提供了核心支撑。

当你使用 NumPy、Pillow 或处理二进制流时,背后几乎都在依赖这项机制。而 memoryview,正是理解与实践这项协议的最佳入口。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
不装了!排挤刀郎、得罪章子怡,58岁那英撕开了内娱的“遮羞布”

不装了!排挤刀郎、得罪章子怡,58岁那英撕开了内娱的“遮羞布”

叨叨话影
2025-11-12 16:46:26
高市早苗宣布参加G20峰会,日专家:或与中方当面沟通台海问题!

高市早苗宣布参加G20峰会,日专家:或与中方当面沟通台海问题!

阿龙聊军事
2025-11-12 19:28:32
重庆通报:三名干部被查处

重庆通报:三名干部被查处

鲁中晨报
2025-11-12 20:11:02
塞尔维亚总统:欧洲正准备与俄罗斯打仗!

塞尔维亚总统:欧洲正准备与俄罗斯打仗!

每日经济新闻
2025-11-12 16:34:09
小米发布2025年双11战报,累计支付金额破290亿元,雷军发文:谢谢大家支持

小米发布2025年双11战报,累计支付金额破290亿元,雷军发文:谢谢大家支持

鲁中晨报
2025-11-12 10:27:09
全运会丨萌翻全场的吉祥物,是这样倒立出圈的!

全运会丨萌翻全场的吉祥物,是这样倒立出圈的!

新华社
2025-11-12 09:46:48
曾主任与祖副院长偷欢现场惊现反转!

曾主任与祖副院长偷欢现场惊现反转!

霹雳炮
2025-11-12 23:05:53
一百多年过去了,现在再来看戊戌变法的内容,还是不由得叹息一声

一百多年过去了,现在再来看戊戌变法的内容,还是不由得叹息一声

近史谈
2025-11-12 20:03:04
一战成名!国足20岁小将走红,传射神似张稀哲,邵佳一注意到他

一战成名!国足20岁小将走红,传射神似张稀哲,邵佳一注意到他

国足风云
2025-11-12 21:51:38
雷军挖来前DeepSeek大将!大模型团队40人合影曝光,疑进军具身智能

雷军挖来前DeepSeek大将!大模型团队40人合影曝光,疑进军具身智能

智东西
2025-11-12 15:45:12
山东U20男足主帅韩鹏:四年的准备以这种方式结束,很难接受

山东U20男足主帅韩鹏:四年的准备以这种方式结束,很难接受

懂球帝
2025-11-12 21:22:59
曾琦医生的事还没过去,又来个劲爆的!

曾琦医生的事还没过去,又来个劲爆的!

诗意世界
2025-11-11 10:42:51
打脸墨菲!赵心童克服疲惫进四强引亨德利盛赞,半决赛魔咒或终结

打脸墨菲!赵心童克服疲惫进四强引亨德利盛赞,半决赛魔咒或终结

夜深聊球
2025-11-12 22:43:06
广州一国企原董事长,被查

广州一国企原董事长,被查

南方都市报
2025-11-12 10:24:47
断崖式降温!暴跌12℃!冷空气即将抵达南京

断崖式降温!暴跌12℃!冷空气即将抵达南京

现代快报
2025-11-12 17:19:07
揭秘詹皇下放发展联盟:参加首次完整训练 状态出色渴望本月回归

揭秘詹皇下放发展联盟:参加首次完整训练 状态出色渴望本月回归

罗说NBA
2025-11-13 06:01:29
42岁刘翔近况曝光,长期在国外旅游,靠终身合同吸金,远离喷子!

42岁刘翔近况曝光,长期在国外旅游,靠终身合同吸金,远离喷子!

姩姩有娱
2025-11-10 17:49:18
没人生娃了?上海一产科医生称:从一晚上8个剖腹产到现在1个没有

没人生娃了?上海一产科医生称:从一晚上8个剖腹产到现在1个没有

寒士之言本尊
2025-11-12 18:30:27
此次未入选巴西队身价前10:拉菲尼亚、萨维尼奥、马丁内利在列

此次未入选巴西队身价前10:拉菲尼亚、萨维尼奥、马丁内利在列

懂球帝
2025-11-13 06:29:49
委内瑞拉全面进入战备状态

委内瑞拉全面进入战备状态

每日经济新闻
2025-11-12 13:56:01
2025-11-13 07:07:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1581文章数 64关注度
往期回顾 全部

科技要闻

前阿里人亲述: “经济上行”期双11什么样

头条要闻

俄外交部:乌方停止与俄谈判说明其缺乏达成和平意愿

头条要闻

俄外交部:乌方停止与俄谈判说明其缺乏达成和平意愿

体育要闻

消磨你上千小时的足球游戏,走过第20年

娱乐要闻

再王珞丹和白百何 明白两人"差别"在哪

财经要闻

段永平最新访谈:聊企业经营 投资理念

汽车要闻

7座皆独立座椅/新增5座版 体验第三代吉利豪越L

态度原创

教育
时尚
本地
艺术
健康

教育要闻

傲慢与偏见英文原版语音课11:我对您的神经很尊重

女人年纪大了也不必慌,掌握这3个穿衣技巧,优雅体面极了

本地新闻

云游安徽 | 凌滩玉魄淬千年,诗意钢城马鞍山

艺术要闻

刚刚、贵州突然流出一批照片,全世界都吃惊了....

血液科专家揭秘白血病七大误区

无障碍浏览 进入关怀版