memoryview()函數(shù)返回給定參數(shù)的內(nèi)存視圖對象。
在了解什么是內(nèi)存視圖之前,我們需要首先了解Python的緩沖區(qū)協(xié)議。
緩沖區(qū)協(xié)議提供了一種訪問對象內(nèi)部數(shù)據(jù)的方法。該內(nèi)部數(shù)據(jù)是存儲器陣列或緩沖區(qū)。
緩沖區(qū)協(xié)議允許一個對象公開其內(nèi)部數(shù)據(jù)(緩沖區(qū)),而另一個可以訪問這些緩沖區(qū)而無需中間復(fù)制。
我們只能在C-API級別上訪問此協(xié)議,而不能使用我們的常規(guī)代碼庫。
因此,為了將相同的協(xié)議公開給普通的Python代碼庫,需要使用內(nèi)存視圖。
內(nèi)存視圖是在Python中公開緩沖區(qū)協(xié)議的安全方法。
它允許您通過創(chuàng)建內(nèi)存視圖對象來訪問對象的內(nèi)部緩沖區(qū)。
我們需要記住,每當(dāng)對對象執(zhí)行某些操作(調(diào)用對象的函數(shù),切片數(shù)組)時,Python都需要創(chuàng)建該對象的副本。
如果我們要處理大量數(shù)據(jù)(例如,圖像的二進(jìn)制數(shù)據(jù)),則不必要地創(chuàng)建大量數(shù)據(jù)的副本,這幾乎沒有用。
使用緩沖協(xié)議,我們可以授予另一個對象訪問權(quán)以使用/修改大數(shù)據(jù)而無需復(fù)制它。這使程序使用更少的內(nèi)存并提高了執(zhí)行速度。
為了使用公開緩沖區(qū)協(xié)議memoryview(),我們使用以下語法:
memoryview(obj)
memoryview()函數(shù)采用單個參數(shù):
memoryview()函數(shù)返回一個內(nèi)存視圖對象。
#隨機(jī)bytearray random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # 訪問內(nèi)存視圖的第零個索引 print(mv[0]) # 從內(nèi)存視圖創(chuàng)建字節(jié) print(bytes(mv[0:2])) # 從內(nèi)存視圖創(chuàng)建列表 print(list(mv[0:3]))
輸出結(jié)果
65 b'AB' [65, 66, 67]
在這里,我們從字節(jié)數(shù)組random_byte_array創(chuàng)建了一個內(nèi)存視圖對象mv。
然后,我們訪問mv的第0個索引,'A'并將其打印(給出ASCII值-65)。
同樣,我們從0和1 訪問mv的索引'AB',并將其轉(zhuǎn)換為字節(jié)。
最后,我們訪問了mv的所有索引并將其轉(zhuǎn)換為列表。 由于內(nèi)部字節(jié)數(shù)組存儲字母的ASCII值,因此輸出為A,B和C的ASCII值列表。
# random bytearray random_byte_array = bytearray('ABC', 'utf-8') print('更新前:', random_byte_array) mv = memoryview(random_byte_array) # 將mv的第一個索引更新為Z mv[1] = 90 print('更新后:', random_byte_array)
輸出結(jié)果
更新前: bytearray(b'ABC') 更新后: bytearray(b'AZC')
在這里,我們將內(nèi)存視圖的第一個索引更新為90,即ASCII值Z。
由于內(nèi)存視圖對象mv引用相同的緩沖區(qū)/內(nèi)存,因此更新mv中的索引也會更新random_byte_array。