為什麽我們使用memoryview()函數?
因為內存視圖是在Python中公開緩衝區協議的安全方法,並且內存視圖在許多有用的上下文中的行為類似於字節(例如,它支持映射協議),所以如果謹慎使用它可以提供足夠的替代方法。偉大的事情是它使用了底層的緩衝協議來避免複製,而隻是弄亂了指向數據的指針。
因此,在進入哪種內存視圖之前,我們需要首先了解緩衝區協議。
緩衝協議:Buffer協議提供了一種訪問對象內部數據的方法。該內部數據是存儲器陣列或緩衝區。它允許一個對象公開其內部數據(緩衝區),而另一個對象無需中間複製即可訪問這些緩衝區。
我們隻能在C-API級別訪問緩衝區協議,而不能使用我們的常規代碼庫。因此,要將相同的協議公開給普通的Python代碼庫,則提供內存視圖。
內存視圖:memoryview對象允許Python代碼無需複製即可訪問支持緩衝區協議的對象的內部數據。
memoryview()函數允許直接讀取和寫入對象的麵向字節的數據,而無需先複製它。由於在切片時不會創建副本,因此在處理大型對象時可以提高性能。
用法:
memoryview(obj) 參數: obj - object whose internal data is to be exposed. supporting buffer protocol - str and bytearray (but not unicode). 返回值: Returns a memoryview object.
# Python program to illustrate
# Modifying internal data using memory view
# random bytearray
byte_array = bytearray('XYZ', 'utf-8')
print('Before update:', byte_array)
mem_view = memoryview(byte_array)
# update 2nd index of mem_view to J
mem_view[2]= 74
print('After update:', byte_array)
輸出:
Before update:bytearray(b'XYZ') After update:bytearray(b'XYJ')
說明我們如何在上述程序中修改內部數據:在這裏,我們將內存視圖的第二個索引更新為ASCII值74(J)。在此內存視圖對象中,mem_view引用相同的緩衝區或內存,並更新mem_view中的索引,並且還更新byte_array。
緩衝協議和內存視圖的重要性
通過使用緩衝區協議,我們可以處理大型數據,就像我們要處理圖像的二進製數據一樣。緩衝區協議,可以創建另一個對象訪問來修改大數據而無需複製它。這使程序使用更少的內存並提高了執行速度。
相關用法
注:本文由純淨天空篩選整理自Shivani Ghughtyal大神的英文原創作品 memoryview() in Python。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。