Python 中的缓冲区

Manav Narula 2023年1月30日 2022年5月17日
  1. 在 Python 中使用 buffer() 函数实现 Buffer 接口
  2. 在 Python 中使用 memoryview() 函数实现缓冲区接口
Python 中的缓冲区

在 Python 中,buffer 类型对象用于以面向字节的格式显示给定对象的内部数据。Python 对缓冲区的主要用途是存储和操作巨大的数据数组并在不创建副本的情况下处理它们。

buffer 接口仅受 stringsUnicodearraysbytearrays 支持。numpy 数组也在后台使用此接口。

我们可以在相同的 buffer 实例上工作,而无需使用 buffer 接口创建数据副本。

import numpy as np
arr = np.array([1,2,3])
arr2 = np.asarray(arr)
arr2[2] = 50
print(arr, arr2)

输出:

[ 1  2 50] [ 1  2 50]

在上面的例子中,我们创建了一个名为 arrnumpy 数组,并使用它创建另一个名为 arr2 的数组。

因为 numpy 模块支持缓冲区协议,并且使用数组的视图发送数据而不是生成新数组,所以更新数组 arr2 也会更新原始 arr

让我们使用 buffer()memoryview() 函数在支持的对象上实现这个接口。

在 Python 中使用 buffer() 函数实现 Buffer 接口

使用 buffer() 函数,我们可以返回给定对象的支持缓冲区接口的只读视图对象(stringsarraysbytesUnicodebytesarray)。它在处理庞大的数据数组时很有用,因为它消除了复制数据。

例子:

a = 'Sample String'
bf = buffer(a, 2, 5)
print bf, type(bf)

输出:

mple  <type 'buffer'>

我们在上面的例子中创建了一个 buffer 类型的对象。该对象返回字符串 a 的视图。

但是,memoryview() 函数取代了 Python 3 中的 buffer() 函数。Python 2.7 支持这两个函数。

在 Python 中使用 memoryview() 函数实现缓冲区接口

在 Python 3 中,memoryview() 函数用于返回实现 buffer 接口的 memoryview 对象并创建支持该接口的对象的视图。

memoryview() 接受字节类对象并返回其视图。在打印时,它会显示原始对象的内存位置。

a = bytearray('Sample Bytes', 'utf-8')
m = memoryview(a)
print(m[2], type(m), m)

输出:

109 <class 'memoryview'> <memory at 0x7f83f2d5f940>

在上面的例子中,我们创建了一个编码的 bytesarray 对象的 memoryview 对象。

Author: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn