【问题标题】:What is Python buffer type for?Python 缓冲区类型有什么用?
【发布时间】:2011-03-26 06:15:01
【问题描述】:

python中有一个buffer类型,但是不知道怎么用。

Python doc 中的描述是:

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

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

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    示例用法:

    >>> 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 在 Python 3 中已被更好地命名为 memoryview 所取代,尽管您可以在 Python 2.7 中使用其中任何一个。

    另请注意,如果不深入研究 C API,您将无法为自己的对象实现缓冲区接口,也就是说,您无法在纯 Python 中实现。

    【讨论】:

    • 感谢您的解释。但是我还是不太明白缓冲和简单切片有什么区别。使用s[6:11] 也不会占用额外的存储空间,我错了吗?
    • 一般来说,切片会占用额外的存储空间,所以是的,s[6:11] 将是一个副本。如果你设置t = s[6:11]然后del s,它会释放s占用的内存,证明t被复制了。 (要看到这一点,您需要更大的 s 并跟踪 Python 的内存使用情况)。但是,如果涉及的数据不多,则仅制作副本会更有效。
    • 非常感谢你 :) 顺便说一句,你能告诉我我可以使用什么工具来跟踪 Python 的内存使用情况吗?
    • 有关内存使用情况,请参见 stackoverflow.com/questions/110259 例如。有时,在任务管理器/活动监视器/顶部查看 Python 的使用情况是最简单的。
    • 对于像我这样的 Python 新手:缓冲区是 Python 3 中的 memoryview
    【解决方案2】:

    我认为缓冲区是例如在将 python 连接到本机库时很有用。 (Guido van Rossum 在this mailinglist post 中解释了buffer)。

    例如,numpy 似乎使用缓冲区来进行高效的数据存储:

    import numpy
    a = numpy.ndarray(1000000)
    

    a.data 是:

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多