當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python memoryview()用法及代碼示例


memoryview() 函數返回給定參數的內存視圖對象。

在我們了解內存視圖是什麽之前,我們需要先了解 Python 的緩衝區協議。

Python 緩衝區協議

緩衝區協議提供了一種訪問對象內部數據的方法。該內部數據是存儲器陣列或緩衝區。

緩衝區協議允許一個對象公開其內部數據(緩衝區),而另一個對象無需中間複製即可訪問這些緩衝區。

我們隻能在C-API 級別訪問此協議,而不使用我們的正常代碼庫。

因此,為了將相同的協議公開給普通的 Python 代碼庫,存在內存視圖。

什麽是內存視圖?

內存視圖是在 Python 中公開緩衝區協議的一種安全方式。

它允許您通過創建內存視圖對象來訪問對象的內部緩衝區。

為什麽緩衝區協議和內存視圖很重要?

我們需要記住,每當我們對對象執行某些操作(調用對象的函數、切片數組)時,Python 都需要創建對象的副本。

如果我們要處理大量數據(例如圖像的二進製數據),我們將不必要地創建大量數據的副本,這幾乎沒有用處。

使用緩衝區協議,我們可以讓另一個對象訪問使用/修改大數據而不複製它。這使得程序使用更少的內存並提高了執行速度。

Python memoryview() 語法

要使用 memoryview() 公開緩衝區協議,我們使用以下語法:

memoryview(obj)

參數:

memoryview() 函數采用單個參數:

  • obj- 要公開其內部數據的對象。obj必須支持緩衝協議(bytes,bytearray)

返回:

memoryview() 函數返回一個內存視圖對象。

示例 1:memoryview() 如何在 Python 中工作?

#random bytearray
random_byte_array = bytearray('ABC', 'utf-8')

mv = memoryview(random_byte_array)

# access memory view's zeroth index
print(mv[0])

# create byte from memory view
print(bytes(mv[0:2]))

# create list from memory view
print(list(mv[0:3]))

輸出

65
b'AB'
[65, 66, 67]

在這裏,我們從字節數組 random_byte_array 創建了一個內存視圖對象 mv

然後,我們訪問 mv 的第 0 個索引 'A' 並打印它(給出 ASCII 值 - 65)。

同樣,我們從 0 和 1 訪問 mv 的索引 'AB' ,並將它們轉換為字節。

最後,我們訪問了所有的索引mv並將其轉換為列表。由於內部bytearray存儲字母的 ASCII 值,輸出是 ASCII 值的列表A,乙,C.

示例 2:使用內存視圖修改內部數據

# random bytearray
random_byte_array = bytearray('ABC', 'utf-8')
print('Before updation:', random_byte_array)

mv = memoryview(random_byte_array)

# update 1st index of mv to Z
mv[1] = 90
print('After updation:', random_byte_array)

輸出

Before updation: bytearray(b'ABC')
After updation: bytearray(b'AZC')

在這裏,我們將內存視圖的第一個索引更新為 90,即 Z 的 ASCII 值。

由於內存視圖對象 mv 引用相同的緩衝區/內存,因此更新 mv 中的索引也會更新 random_byte_array

相關用法


注:本文由純淨天空篩選整理自 Python memoryview()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。