什么是Python缓冲区类型?


136

bufferpython中有一个类型,但是我不知道如何使用它。

Python文档中,描述为:

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

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

Answers:


145

用法示例:

>>> 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'

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

请注意,尽管您可以在Python 2.7中使用它,但是buffer已经被memoryviewPython 3中的更好名称所代替。

还要注意,如果不深入研究C API,就不能为自己的对象实现缓冲区接口,即,不能在纯Python中做到这一点。


感谢您的解释。但是我仍然不太了解缓冲和简单切片之间的区别。使用s[6:11]也不占用额外的存储空间,对吗?
satoru

9
通常,切片将占用额外的存储空间,因此是的s[6:11]将是副本。如果先设置t = s[6:11],然后del s释放,则释放占用的内存s,证明t已复制。(要查看此内容,您需要更大的空间s并跟踪Python的内存使用情况)。但是,如果涉及的数据不多,仅制作副本会更有效率。
Scott Griffiths 2010年

1
非常感谢您:)顺便说一句,能否请您告诉我我可以使用哪种工具来跟踪Python的内存使用情况?
satoru

有关内存使用情况,请参见例如stackoverflow.com/questions/110259。有时,仅在Task Manager / Activity Monitor / top中观察Python的用法最简单。
Scott Griffiths

13
对于像我这样的Python新手:缓冲区是Python 3中的memoryview
Dirk Bester

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.