Python 的内置函数 memoryview 是一个强大的工具,它允许我们以高效的方式访问和操作支持缓冲区协议的对象(如 bytes、bytearray 或 array.array)的内存内容,而无需创建额外的副本。
核心功能与特点
典型使用场景
- 高效数据处理:
data = bytearray(b'ABCDEFG')
mv = memoryview(data)
mv[2:4] = b'XY' # 直接修改底层数据
print(data) # 输出:bytearray(b'ABXYEFG')
- 大型文件处理:
with open('large_file.bin', 'rb') as f:
mv = memoryview(f.read()) # 避免多次复制
process_chunk(mv[0:1024]) # 处理第一个1KB数据块
- 与C扩展交互:
- 为C扩展模块提供直接的内存访问接口
- 避免Python对象与C缓冲区之间的数据拷贝
性能优势
- 在处理GB级别的数据时,
memoryview可以节省大量内存和CPU时间 - 基准测试显示,使用
memoryview处理大型字节串的速度比常规切片快3-5倍
注意事项
-
生命周期管理:
memoryview对象会保持原始缓冲区的引用- 原始缓冲区不能被释放,直到所有关联的
memoryview都被销毁
-
类型限制:
- 不可变缓冲区(如
bytes)创建的memoryview是只读的 - 只有可变缓冲区(如
bytearray)支持修改操作
- 不可变缓冲区(如
-
维度支持:
- 可以处理多维数据(特别是与
array.array或 NumPy数组配合使用时) - 支持指定格式说明符(如
'i'表示整数,'f'表示浮点数)
- 可以处理多维数据(特别是与
高级用法示例
import array
arr = array.array('d', [1.0, 2.0, 3.0, 4.0])
mv = memoryview(arr)
print(mv.tolist()) # 转换为Python列表
print(mv[::2].tolist()) # 步长为2的切片
memoryview 是Python中处理二进制数据的高效工具,特别适合性能敏感的应用场景,如科学计算、网络编程和文件处理等领域。
随时随地看视频