代码之家  ›  专栏  ›  技术社区  ›  satoru

什么是python缓冲区类型?

  •  126
  • satoru  · 技术社区  · 15 年前

    有一个 buffer 输入python,但我不知道如何使用它。

    Python doc 说明如下:

    buffer(object[, offset[, size]])

    对象参数必须是支持缓冲区调用接口(如字符串、数组和缓冲区)的对象。将创建一个引用对象参数的新缓冲区对象。缓冲区对象将是从对象开始(或从指定的偏移量)开始的切片。切片将扩展到对象的末尾(或具有由大小参数给定的长度)。

    2 回复  |  直到 9 年前
        1
  •  128
  •   Scott Griffiths    9 年前

    示例用法:

    >>> s = 'Hello world'
    >>> t = buffer(s, 6, 5)
    >>> t
    <read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
    >>> print t
    world
    

    在本例中,缓冲区是一个子字符串,从位置6开始,长度为5,它不占用额外的存储空间-它引用了字符串的一部分。

    对于这样的短字符串来说,这不是很有用,但是在使用大量数据时,这是必要的。此示例使用可变 bytearray :

    >>> s = bytearray(1000000)   # a million zeroed bytes
    >>> t = buffer(s, 1)         # slice cuts off the first byte
    >>> s[1] = 5                 # set the second element in s
    >>> t[0]                     # which is now also the first element in t!
    '\x05'
    

    如果您希望在数据上有多个视图,并且不希望(或不能)在内存中保存多个副本,这将非常有用。

    注意 buffer 已被更名为 memoryview 在python 3中,尽管您可以在python 2.7中使用。

    还要注意,如果不深入研究C API,就不能为自己的对象实现缓冲区接口,也就是说,不能在纯Python中实现缓冲区接口。

        2
  •  22
  •   Chankey Pathak    9 年前

    我认为缓冲区在将Python连接到本机库时很有用。(Guido van Rossum解释说 buffer 在里面 this mailinglist post )

    例如,numpy似乎使用缓冲区来有效地存储数据:

    import numpy
    a = numpy.ndarray(1000000)
    

    这个 a.data 是:

    <read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>