Python 基礎(chǔ)教程

Python 流程控制

Python 函數(shù)

Python 數(shù)據(jù)類型

Python 文件操作

Python 對象和類

Python 日期和時間

Python 高級知識

Python 參考手冊

Python memoryview() 使用方法及示例

Python 內(nèi)置函數(shù)

memoryview()函數(shù)返回給定參數(shù)的內(nèi)存視圖對象。

在了解什么是內(nèi)存視圖之前,我們需要首先了解Python的緩沖區(qū)協(xié)議。

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)存視圖?

內(nèi)存視圖是在Python中公開緩沖區(qū)協(xié)議的安全方法。

它允許您通過創(chuàng)建內(nèi)存視圖對象來訪問對象的內(nèi)部緩沖區(qū)。

為什么緩沖區(qū)協(xié)議和內(nèi)存視圖很重要?

我們需要記住,每當(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í)行速度。

Python memoryview()語法

為了使用公開緩沖區(qū)協(xié)議memoryview(),我們使用以下語法:

memoryview(obj)

memoryview()參數(shù)

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

  • obj-要公開其內(nèi)部數(shù)據(jù)的對象。obj必須支持緩沖協(xié)議(bytes,bytearray

memoryview()返回值

memoryview()函數(shù)返回一個內(nèi)存視圖對象。

示例1:如何在Python中使用memoryview()?

#隨機(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值列表。

示例2:使用內(nèi)存視圖修改內(nèi)部數(shù)據(jù)

# 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。

Python 內(nèi)置函數(shù)

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清