美文网首页
memoryview实现buffer protocol

memoryview实现buffer protocol

作者: forjie | 来源:发表于2019-12-27 16:09 被阅读0次

    正常情况下,我们使用切片的操作时,会复制之前的内存,并且重新开辟一块内存空间放新的数据,总体来说非常浪费资源

    而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]
    

    相关文章

      网友评论

          本文标题:memoryview实现buffer protocol

          本文链接:https://www.haomeiwen.com/subject/oifdoctx.html