python内存视图_Python memoryview() 使用方法及示例

2021-01-25 10:26:13 浏览数 (1)

参考链接: Python memoryview()

Python memoryview() 使用方法及示例

 memoryview()函数返回给定参数的内存视图对象。

 在了解什么是内存视图之前,我们需要首先了解Python的缓冲区协议。

 Python缓冲区协议

 缓冲区协议提供了一种访问对象内部数据的方法。该内部数据是存储器阵列或缓冲区。

 缓冲区协议允许一个对象公开其内部数据(缓冲区),而另一个可以访问这些缓冲区而无需中间复制。

 我们只能在C-API级别上访问此协议,而不能使用我们的常规代码库。

 因此,为了将相同的协议公开给普通的Python代码库,需要使用内存视图。

 什么是内存视图?

 内存视图是在Python中公开缓冲区协议的安全方法。

 它允许您通过创建内存视图对象来访问对象的内部缓冲区。

 为什么缓冲区协议和内存视图很重要?

 我们需要记住,每当对对象执行某些操作(调用对象的函数,切片数组)时,Python都需要创建该对象的副本。

 如果我们要处理大量数据(例如,图像的二进制数据),则不必要地创建大量数据的副本,这几乎没有用。

 使用缓冲协议,我们可以授予另一个对象访问权以使用/修改大数据而无需复制它。这使程序使用更少的内存并提高了执行速度。

 Python memoryview()语法

 为了使用公开缓冲区协议memoryview(),我们使用以下语法:memoryview(obj)

 memoryview()参数

 memoryview()函数采用单个参数:obj-要公开其内部数据的对象。obj必须支持缓冲协议(bytes,bytearray)

 memoryview()返回值

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

 示例1:如何在Python中使用memoryview()?

 示例#随机bytearray

 random_byte_array = bytearray('ABC', 'utf-8')

 mv = memoryview(random_byte_array)

 # 访问内存视图的第零个索引

 print(mv[0])

 # 从内存视图创建字节

 print(bytes(mv[0:2]))

 # 从内存视图创建列表

 print(list(mv[0:3]))

 输出结果65

 b'AB'

 [65, 66, 67]

 在这里,我们从字节数组random_byte_array创建了一个内存视图对象mv。

 然后,我们访问mv的第0个索引,'A'并将其打印(给出ASCII值-65)。

 同样,我们从0和1 访问mv的索引'AB',并将其转换为字节。

 最后,我们访问了mv的所有索引并将其转换为列表。 由于内部字节数组存储字母的ASCII值,因此输出为A,B和C的ASCII值列表。

 示例2:使用内存视图修改内部数据

 示例# random bytearray

 random_byte_array = bytearray('ABC', 'utf-8')

 print('更新前:', random_byte_array)

 mv = memoryview(random_byte_array)

 # 将mv的第一个索引更新为Z

 mv[1] = 90

 print('更新后:', random_byte_array)

 输出结果更新前: bytearray(b'ABC')

 更新后: bytearray(b'AZC')

 在这里,我们将内存视图的第一个索引更新为90,即ASCII值Z。

 由于内存视图对象mv引用相同的缓冲区/内存,因此更新mv中的索引也会更新random_byte_array。

0 人点赞