本系列将会陆续整理分享一些的Python内置函数。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/11x9_wCZ3yiYOe5nVcRk2CQ?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_built-in_functions
memoryview(object)
-
object:一个支持缓冲区协议的对象。例如,字节序列(如bytes、bytearray)、数组(如array.array)、NumPy数组等。
返回值:
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
-
shape、strides和ndim:用于查询内存视图的形状、步长和维度数,在处理多维数组时非常有用。 -
release():释放内存视图所引用的缓冲区。一旦调用了这个方法,内存视图对象将不再有效。
https://docs.python.org/3/library/stdtypes.html#typememoryview
下面是一些使用 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]]


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