Python memoryview()函数

memoryview()函数是一个内置函数,它返回一个memoryview对象,该对象可以用于在 Python 中访问二进制数据。

这个函数接受一个对象作为参数,这个对象可以是一个bytes对象、一个bytearray对象或一个可缓冲对象。返回的memoryview对象提供了一个类似于bytearray对象的接口,但它不是一个真正的可变序列,而是一个只读视图,它可以访问原始对象的内存。

这个函数可以用于在 Python 中操作二进制数据,例如在处理音频、视频或图像文件时。使用memoryview()函数可以提高处理效率,因为它允许您直接访问原始数据的内存,而无需创建临时副本。

memoryview()函数示例

以下是一些简单的示例,演示如何使用memoryview()函数访问二进制数据:

# 创建一个包含二进制数据的 bytes 对象
data = bytes([0x10, 0x20, 0x30, 0x40])

# 创建一个内存视图对象
view = memoryview(data)

# 访问内存视图对象的内容
print(view[0])    # 输出 16
print(view[1])    # 输出 32
print(view[2])    # 输出 48
print(view[3])    # 输出 64

view2 = memoryview(b'abcefg')
print(view2[0])   # 输出 97
print(view2[1])   # 输出 98
# 使用切片访问
print(view2[1:4]) # 输出 <memory at 0x0000021D34B9E7C0>

如果下层对象是可写的,则memoryview支持一维切片赋值。改变大小则不被允许:

data = bytearray(b'abcefg')
view = memoryview(data)
print(view.readonly)
view[0] = ord(b'z')
view[1:3] = b'xx'
#view[1:3] = b'kkk' #不被允许,长度不匹配
print(data)

程序运行结果

False
bytearray(b'zxxefg')

memoryview 对象

memoryview具有以下一些常用方法:

tobytes

将缓冲区中的数据作为字节串返回。这相当于在内存视图上调用bytes构造器:

view = memoryview(b'abcdefg')
print(view.tobytes()) # 输出 b'abcdefg'
print(bytes(view))    # 输出 b'abcdefg'

hex()

返回一个字符串对象,其中分别以两个十六进制数码表示缓冲区里的每个字节:

view = memoryview(b'abcdefg')
print(view.hex()) # 输出 61626364656667

tolist()

将缓冲区内的数据以一个元素列表的形式返回:

view = memoryview(b'abcdefg')
print(view.tolist()) #输出 [97, 98, 99, 100, 101, 102, 103]

toreadonly()

返回memoryview对象的只读版本。原始的memoryview对象不会被改变:

view = memoryview(b'abcdefg')
view2 = view.toreadonly()
view2[1:3] = b'xx' # TypeError: cannot modify read-only memory

release()

释放由内存视图对象所公开的底层缓冲区:

view = memoryview(b'abcdefg')
view.release()
print(view[0]) #ValueError: operation forbidden on released memoryview object

使用with语句,可以通过上下文管理协议达到类似的效果:

with memoryview(b'abcdefg') as view:
    print(view[0]) # 输出 97

print(view[0]) #ValueError: operation forbidden on released memoryview object

readonly

一个表明内存是否只读的布尔值,取决于下层对象:

v1 = memoryview(bytes(b'abcdefg'))
print(v1.readonly) #True
v2 = memoryview(bytearray(b'abcdefg'))
print(v2.readonly) #False

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/python-built-in-functions/python-memoryview.html

分类: 计算机技术
推荐阅读:
Python min()函数 min() 是 Python 的内置函数之一,用于返回给定可迭代对象中的最小值。该函数可以接受多个参数,也可以接受一个可迭代对象作为参数。
Rust解析TOML,结构体序列化和反序列化 在Rust中,可以使用标准库中的toml模块来解析和生成TOML格式的数据;serde与toml模块集成,可以将TOML字符串解析为任意Rust结构体,或将rust结构体序列化为TOML格式的字符串。
Python中执行JavaScript代码 在Python爬虫运用中,经常会碰到需要模拟JS(JavaScript)代码所实现功能的场景。如果使用Python来模拟出JS的功能,不仅需要把JS代码转换成Python代码,而且还可能会碰到经过加密或压缩过的JS代码,这时就需要先解密JS代码,不是一件轻松的事,那么我们为什么不直接由Python来调用JS代码呢。
如何将Rust更新到最新版 Rust每隔一段时间就会有新的版本,若要将已安装的Rust更新到最新版,并不用先卸载旧的版本,只需要使用 rustup 工具;
让自己的网页在手机QQ中以卡片的方式分享出去 在使用QQ进行聊天的过程中,发送自己网页的链接时(不是打开网站后分享给好友,单单指将网页链接以文本的形式发送出去),默认情况下是不会以卡片形式显示的,那么如何让别人看到的是卡片呢。
C语言中 i++ 和 ++i 的区别 在C语言中,++ 运算符也叫递增运算符,只需要一个操作数,属于一元运算符;本文将讨论前缀++运算符和后缀++运算符的区别,以及符号优先级的问题;