memoryview() 函数返回给定参数的内存视图对象。
在我们了解内存视图是什么之前,我们需要先了解 Python 的缓冲区协议。
Python 缓冲区协议
缓冲区协议提供了一种访问对象内部数据的方法。该内部数据是存储器阵列或缓冲区。
缓冲区协议允许一个对象公开其内部数据(缓冲区),而另一个对象无需中间复制即可访问这些缓冲区。
我们只能在C-API 级别访问此协议,而不使用我们的正常代码库。
因此,为了将相同的协议公开给普通的 Python 代码库,存在内存视图。
什么是内存视图?
内存视图是在 Python 中公开缓冲区协议的一种安全方式。
它允许您通过创建内存视图对象来访问对象的内部缓冲区。
为什么缓冲区协议和内存视图很重要?
我们需要记住,每当我们对对象执行某些操作(调用对象的函数、切片数组)时,Python 都需要创建对象的副本。
如果我们要处理大量数据(例如图像的二进制数据),我们将不必要地创建大量数据的副本,这几乎没有用处。
使用缓冲区协议,我们可以让另一个对象访问使用/修改大数据而不复制它。这使得程序使用更少的内存并提高了执行速度。
Python memoryview() 语法
要使用 memoryview()
公开缓冲区协议,我们使用以下语法:
memoryview(obj)
参数:
memoryview()
函数采用单个参数:
返回:
memoryview()
函数返回一个内存视图对象。
示例 1:memoryview() 如何在 Python 中工作?
#random bytearray
random_byte_array = bytearray('ABC', 'utf-8')
mv = memoryview(random_byte_array)
# access memory view's zeroth index
print(mv[0])
# create byte from memory view
print(bytes(mv[0:2]))
# create list from memory view
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
并将其转换为列表。由于内部bytearray
存储字母的 ASCII 值,输出是 ASCII 值的列表A,乙,和C.
示例 2:使用内存视图修改内部数据
# random bytearray
random_byte_array = bytearray('ABC', 'utf-8')
print('Before updation:', random_byte_array)
mv = memoryview(random_byte_array)
# update 1st index of mv to Z
mv[1] = 90
print('After updation:', random_byte_array)
输出
Before updation: bytearray(b'ABC') After updation: bytearray(b'AZC')
在这里,我们将内存视图的第一个索引更新为 90,即 Z
的 ASCII 值。
由于内存视图对象 mv
引用相同的缓冲区/内存,因此更新 mv
中的索引也会更新 random_byte_array
。
相关用法
- Python memoryview()用法及代码示例
- Python statistics median_high()用法及代码示例
- Python statistics median_low()用法及代码示例
- Python statistics median()用法及代码示例
- Python statistics median_grouped()用法及代码示例
- Python numpy ma.MaskedArray.view用法及代码示例
- Python matplotlib.patches.Rectangle用法及代码示例
- Python matplotlib.pyplot.step()用法及代码示例
- Python math.cos()用法及代码示例
- Python math.cosh()用法及代码示例
- Python math.acosh()用法及代码示例
- Python matplotlib.axes.Axes.pie()用法及代码示例
- Python map()用法及代码示例
- Python math.fmod()用法及代码示例
- Python math.fsum()用法及代码示例
- Python numpy ma.sort用法及代码示例
- Python matplotlib.pyplot.semilogy()用法及代码示例
- Python math.factorial()用法及代码示例
- Python math.remainder()用法及代码示例
- Python math.asinh()用法及代码示例
注:本文由纯净天空筛选整理自 Python memoryview()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。