正常情况下,我们使用切片的操作时,会复制之前的内存,并且重新开辟一块内存空间放新的数据,总体来说非常浪费资源
而memoryview在对象实现了buffer protocol(缓存协议)的情况下,是用memoryview可以直接使用当前对象的内存空间,这是在C语言层级提供的功能.
buffer protocol缓存协议:定义了一些对象公开自己的底层缓存地址,比如:bytes, bytesarray和array.array数组
参考:https://docs.python.org/zh-cn/3/c-api/buffer.html
ps:在我们要使用对象的原始缓存,首先要确定对象是支持buffer protocol的数据对象
例子:
# 字符串:切换不会新增内存地址,修改后,原数据也会进行修改
a = bytearray(b'aaaaaaaaaa')
ma=memoryview(a)
ma3=ma[:3]
print(ma3.tobytes())
ma3[:3]=b'nnn'
print(ma.tobytes().decode('utf-8'))
==>
b'aaa'
nnnaaaaaaa
列表:支持array(数组)
from array import array
arr = array('h', [1, 2, 3, 4, 5])
mv = memoryview(arr)
arr3 = mv[:3]
# 修改arr3的数据,原数据也被修改
arr3[:3] = array('h', [1, 1, 1])
print(mv.tolist())
==>
[1, 1, 1, 4, 5]
网友评论