Python 中的缓冲区
在 Python 中,buffer
类型对象用于以面向字节的格式显示给定对象的内部数据。Python 对缓冲区的主要用途是存储和操作巨大的数据数组并在不创建副本的情况下处理它们。
buffer
接口仅受 strings
、Unicode
、arrays
和 bytearrays
支持。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]
在上面的例子中,我们创建了一个名为 arr
的 numpy
数组,并使用它创建另一个名为 arr2
的数组。
因为 numpy
模块支持缓冲区协议,并且使用数组的视图发送数据而不是生成新数组,所以更新数组 arr2
也会更新原始 arr
。
让我们使用 buffer()
和 memoryview()
函数在支持的对象上实现这个接口。
在 Python 中使用 buffer()
函数实现 Buffer 接口
使用 buffer()
函数,我们可以返回给定对象的支持缓冲区接口的只读视图对象(strings
、arrays
、bytes
、Unicode
、bytesarray
)。它在处理庞大的数据数组时很有用,因为它消除了复制数据。
例子:
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
对象。
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