首页Python【Python内置函数】m...

【Python内置函数】memoryview()函数

Python 提供了许多内置函数,这些函数是Python语言的一部分,可以直接在Python程序中使用而无需导入任何模块。

本系列将会陆续整理分享一些的Python内置函数。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_functions





01
简介

memoryview()函数的主要作用是提供对支持缓冲区协议对象的内存访问。它允许以只读或可写的方式访问内存,而无需复制数据。这个内存视图对象允许以不同的方式(例如切片、重新塑形等)来访问和操作这块内存,而无需复制数据,从而提高效率。这在处理大型数据(如图像、音频文件等)时非常有用,可以节省内存和提高性能。

memoryview() 函数的基本语法如下:

memoryview(object)
参数说明:
  • object:一个支持缓冲区协议的对象。例如,字节序列(如bytesbytearray)、数组(如array.array)、NumPy数组等。

返回值:

memoryview()函数返回一个内存视图对象(memory view object)。

memoryview的行为取决于底层对象是否支持缓冲区协议。memoryview对象支持切片操作,这使得它非常灵活。如果对象是不可变的(如 bytes),则memoryview也是不可写的。对memoryview对象的修改会反映到原始对象中,反之亦然。
memoryview对象引用的内存区域是由原始对象管理的。当底层对象被释放时(如del或对象生命周期结束),memoryview将无法访问内存,可能会引发错误。
memoryview 提供了一些常用的方法:
  • tobytes():将内存视图的内容转换为字节序列。
  • tolist():将内存视图的内容转换为列表。
  • format:返回内存视图的格式字符串。
  • cast(format[, shape])将内存视图重新解释为新的数据类型或形状。其中,format参数为目标数据格式字符串,需遵循 struct 模块语法,且必须是单一元素的本机格式(如 ‘I’ 表示 4 字节无符号整数);shape参数用于定义新视图的多维形状,必须是 C 连续内存布局(默认为一维:[总字节数 // 新元素大小])。

    关于 struct 模块语法相关内容可以查看官方文档:

    https://docs.python.org/3/library/struct.html#struct-interpret-bytes-as-packed-binary-data

  • shapestridesndim:用于查询内存视图的形状、步长和维度数,在处理多维数组时非常有用。
  • release():释放内存视图所引用的缓冲区。一旦调用了这个方法,内存视图对象将不再有效。
更多关于memoryview的信息,包括如何创建多维视图、如何切片、如何释放内存视图等,可以查阅Python的官方文档中关于Memory Views的部分。
https://docs.python.org/3/library/stdtypes.html#typememoryview

02
使用

下面是一些使用 memoryview() 函数的示例:

示例 1:创建内存视图

# 使用 bytes
data_bytes = b"Hello, world!"
# 使用 memoryview 函数创建一个内存视图对象,它引用了 b 的内存区域
mv_bytes = memoryview(data_bytes)
print(mv_bytes)  # <memory at 0x...>
print(mv_bytes.tobytes())  # b'Hello, world!'

# 使用 bytearray
data_bytearray = bytearray(b"Hello, world!")
mv_bytearray = memoryview(data_bytearray)
print(mv_bytearray)  # <memory at 0x...>
print(mv_bytearray.tobytes())  # b'Hello, world!'


  • 示例 2:访问和修改数据

如果内存视图是从可变对象(如 bytearray)创建的,那么可以通过内存视图修改数据。

# 修改视图数据影响原对象
# 修改第一个字节为 'J'
mv_bytearray[0] = ord('J')  
print(mv_bytearray.tobytes())  # 输出: b'Jello, world!'
print(data_bytearray)  # 输出: bytearray(b'Jello, world!')


  • 示例 3:切片操作(零拷贝)

mv_slice = mv_bytearray[0:5]  # 切片操作不复制数据
print(bytes(mv_slice))  # 输出: b'Jello'
mv_slice[0] = 65    # ASCII 'A'
print(data_bytearray)         # 输出: bytearray(b'Aello, world!')


  • 示例 4:多维视图

memoryview 还支持多维视图,这在处理多维数组时非常有用。

import array
arr = array.array('B', [0, 1, 2, 3, 4, 5])
mv = memoryview(arr)
# 转换为 2x3 的二维视图(元素类型为字节)
mv_multi = mv.cast('B', (2, 3))
# 内存视图的形状、步长和维度数
print(mv.shape , mv.strides , mv.ndim)  # 输出: (6,) (1,) 1
# 转为列表
print(mv_multi.tolist())  # 输出: [[0, 1, 2], [3, 4, 5]]

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments