memoryview() 函數返回給定參數的內存視圖對象。
在我們了解內存視圖是什麽之前,我們需要先了解 Python 的緩衝區協議。
Python 緩衝區協議
緩衝區協議提供了一種訪問對象內部數據的方法。該內部數據是存儲器陣列或緩衝區。
緩衝區協議允許一個對象公開其內部數據(緩衝區),而另一個對象無需中間複製即可訪問這些緩衝區。
我們隻能在C-API 級別訪問此協議,而不使用我們的正常代碼庫。
因此,為了將相同的協議公開給普通的 Python 代碼庫,存在內存視圖。
什麽是內存視圖?
內存視圖是在 Python 中公開緩衝區協議的一種安全方式。
它允許您通過創建內存視圖對象來訪問對象的內部緩衝區。
為什麽緩衝區協議和內存視圖很重要?
我們需要記住,每當我們對對象執行某些操作(調用對象的函數、切片數組)時,Python 都需要創建對象的副本。
如果我們要處理大量數據(例如圖像的二進製數據),我們將不必要地創建大量數據的副本,這幾乎沒有用處。
使用緩衝區協議,我們可以讓另一個對象訪問使用/修改大數據而不複製它。這使得程序使用更少的內存並提高了執行速度。
Python memoryview() 語法
要使用 memoryview()
公開緩衝區協議,我們使用以下語法:
memoryview(obj)
參數:
memoryview()
函數采用單個參數:
返回:
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()用法及代碼示例
- Python statistics median_high()用法及代碼示例
- Python statistics median_low()用法及代碼示例
- Python statistics median()用法及代碼示例
- Python statistics median_grouped()用法及代碼示例
- Python numpy ma.MaskedArray.view用法及代碼示例
- Python matplotlib.patches.Rectangle用法及代碼示例
- Python matplotlib.pyplot.step()用法及代碼示例
- Python math.cos()用法及代碼示例
- Python math.cosh()用法及代碼示例
- Python math.acosh()用法及代碼示例
- Python matplotlib.axes.Axes.pie()用法及代碼示例
- Python map()用法及代碼示例
- Python math.fmod()用法及代碼示例
- Python math.fsum()用法及代碼示例
- Python numpy ma.sort用法及代碼示例
- Python matplotlib.pyplot.semilogy()用法及代碼示例
- Python math.factorial()用法及代碼示例
- Python math.remainder()用法及代碼示例
- Python math.asinh()用法及代碼示例
注:本文由純淨天空篩選整理自 Python memoryview()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。