Python 中的緩衝區

Manav Narula 2023年10月10日
  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 物件。

作者: 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