📜  Python中的 memoryview()

📅  最后修改于: 2022-05-13 01:54:36.905000             🧑  作者: Mango

Python中的 memoryview()

Python memoryview()函数返回内存视图对象。在进一步了解 memoryview()函数之前,让我们看看为什么要使用这个函数。

为什么我们使用 memoryview()函数?

由于内存视图是在Python中公开缓冲区协议的一种安全方式,并且内存视图在许多有用的上下文中的行为就像字节一样(例如,它支持映射协议),因此如果小心使用它可以提供足够的替代品。它的伟大之处在于它使用底层的缓冲区协议来避免复制并只是处理指向数据的指针。所以在我们进入内存视图之前,我们需要先了解缓冲区协议。

缓冲协议

缓冲区协议提供了一种访问对象内部数据的方法。该内部数据是存储器阵列或缓冲区。它允许一个对象公开其内部数据(缓冲区),而另一个对象无需中间复制即可访问这些缓冲区。我们只能在C-API级别访问缓冲区协议,而不是使用我们的正常代码库。因此,为了向普通的Python代码库公开相同的协议,内存视图是存在的。

内存视图

memoryview 对象允许Python代码访问支持缓冲区协议的对象的内部数据,而无需复制。 memoryview()函数允许对对象的面向字节的数据进行直接读写访问,而无需先复制它。在对大型对象进行操作时,这可以产生很大的性能提升,因为它在切片时不会创建副本。

Python memoryview() 示例

示例 1: Python memoryview() 有效

Python3
byte_array = bytearray('XYZ', 'utf-8')
 
mv = memoryview(byte_array)
 
print(mv[0])
print(bytes(mv[0:1]))


Python3
# Python program to illustrate
# Modifying internal data using memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
print('Before update:', byte_array)
 
mem_view = memoryview(byte_array)
 
# update 2nd index of mem_view to J
mem_view[2] = 74
print('After update:', byte_array)


Python3
# Python program to illustrate memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
 
mem_view = memoryview(byte_array)
print(type(mem_view))
 
byt = bytes(mem_view)
print(type(byt))


Python3
# Python program to illustrate memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
 
mem_view = memoryview(byte_array)
print(type(mem_view))
 
string = str(mem_view)
print(type(string))


输出:

88
b'X

示例 2:使用 memoryview 修改内部数据

Python3

# Python program to illustrate
# Modifying internal data using memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
print('Before update:', byte_array)
 
mem_view = memoryview(byte_array)
 
# update 2nd index of mem_view to J
mem_view[2] = 74
print('After update:', byte_array)

输出:

Before update: bytearray(b'XYZ')
After update: bytearray(b'XYJ')

解释我们如何在上面的程序中修改内部数据:这里,我们将内存视图的第二个索引更新为 ASCII 值 74 (J)。在此 memoryview 对象中,mem_view 引用相同的缓冲区或内存并更新 mem_view 中的索引,它还更新 byte_array。

示例 3: Python memoryview() 到字节

Python3

# Python program to illustrate memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
 
mem_view = memoryview(byte_array)
print(type(mem_view))
 
byt = bytes(mem_view)
print(type(byt))

输出:


示例 4: Python memoryview() 到字符串

Python3

# Python program to illustrate memory view
 
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
 
mem_view = memoryview(byte_array)
print(type(mem_view))
 
string = str(mem_view)
print(type(string))

输出:


缓冲区协议和内存视图的重要性

通过使用缓冲区协议,我们可以像处理图像的二进制数据一样处理大数据。缓冲协议,可以创建另一个对象访问来修改大数据而不复制它。这使得程序使用更少的内存并提高了执行速度。