Python中的'buffer'类型有什么用?

151 投票
2 回答
190877 浏览
提问于 2025-04-16 02:25

在Python中有一种叫做buffer的类型,但我该怎么使用它呢?

Python文档关于buffer()的说明中,内容是:

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

这里的object参数必须是一个支持buffer调用接口的对象(比如字符串、数组和缓冲区)。这会创建一个新的buffer对象,它会引用你传入的object参数。这个buffer对象会从object的开头开始切片(或者从你指定的偏移量开始)。这个切片会一直延伸到object的末尾(或者长度由size参数决定)。

2 个回答

30

我觉得缓冲区在把Python和本地库连接起来时特别有用。比如,Guido van Rossum这篇邮件中就解释了什么是buffer

举个例子,NumPy好像就是利用缓冲区来高效存储数据的:

import numpy
a = numpy.ndarray(1000000)

这里的a.data是一个:

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

下面是一个使用示例:

>>> 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 3中,buffer 被更好命名的 memoryview 替代了,不过在Python 2.7中你可以使用任意一种。

另外要注意的是,你不能为自己的对象实现缓冲区接口,除非深入了解C语言的API,也就是说,你不能仅用纯Python来做到这一点。

撰写回答