为什么我们使用memoryview()函数?
因为内存视图是在Python中公开缓冲区协议的安全方法,并且内存视图在许多有用的上下文中的行为类似于字节(例如,它支持映射协议),所以如果谨慎使用它可以提供足够的替代方法。伟大的事情是它使用了底层的缓冲协议来避免复制,而只是弄乱了指向数据的指针。
因此,在进入哪种内存视图之前,我们需要首先了解缓冲区协议。
缓冲协议:Buffer协议提供了一种访问对象内部数据的方法。该内部数据是存储器阵列或缓冲区。它允许一个对象公开其内部数据(缓冲区),而另一个对象无需中间复制即可访问这些缓冲区。
我们只能在C-API级别访问缓冲区协议,而不能使用我们的常规代码库。因此,要将相同的协议公开给普通的Python代码库,则提供内存视图。
内存视图:memoryview对象允许Python代码无需复制即可访问支持缓冲区协议的对象的内部数据。
memoryview()函数允许直接读取和写入对象的面向字节的数据,而无需先复制它。由于在切片时不会创建副本,因此在处理大型对象时可以提高性能。
用法:
memoryview(obj) 参数: obj - object whose internal data is to be exposed. supporting buffer protocol - str and bytearray (but not unicode). 返回值: Returns a memoryview object.
# 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)。在此内存视图对象中,mem_view引用相同的缓冲区或内存,并更新mem_view中的索引,并且还更新byte_array。
缓冲协议和内存视图的重要性
通过使用缓冲区协议,我们可以处理大型数据,就像我们要处理图像的二进制数据一样。缓冲区协议,可以创建另一个对象访问来修改大数据而无需复制它。这使程序使用更少的内存并提高了执行速度。
相关用法
注:本文由纯净天空筛选整理自Shivani Ghughtyal大神的英文原创作品 memoryview() in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。