Fluent Python: memoryview


  關於Python的memoryview內置類,搜索國內網站相關博客后發現對其解釋都很簡單,

我覺得學習一個新的知識點一般都要弄清楚兩點:

1, 什么時候使用?(也就是能解決什么問題) 2,如何使用?

對照Fluent Python一書2.9.2 以及網上相關資料后,對memoryview內置類做一些總結:

 

(1)什么時候應該使用memoryview內置類

Travis Oliphant在statkoverflow上是如此回答的:

# A memoryview is essentially a generalized NumPy array structure in 
# Python itself (without the math). It allows you to share memory between # data-structures (things like PIL images, SQLlite data-bases, NumPy 
# arrays, etc.) without first copying. This is very important for large data 
# sets.

內存視圖其實是泛化和去數學化的Numpy數組,它讓你在不需要復制內容的前提下,在數據結構之間共享內存,其中數據結構可以是任何形式的,比如PIL圖片,SQLite數據庫,Numpy的數組等等

這個功能在處理大型數據集合的時候非常重要。

memoryview.cast()方法的概念跟數組模塊類似,能用不同的方式讀寫同一塊內存,而且內容字節不會隨意移動,聽上去和C語言的類型轉換的概念很像。

 

(2) 如何使用memoryview:

我們還是通過示例來看看如何使用memoryview(利用memoryview精准的修改一個數組的某個字節):

我們先定義一個數組,里面每一個元素都是unsigned short類型:

>>> numbers = array('h', [-2, -1, 0, 1, 2])  # # type 'h': signed short

然后把這個數組傳入memoryview的構造函數創建實例, 並查看memoryview實例的長度和成員:

>>> mem_short = memoryview(numbers)
>>> len(mem_short)
5
>>> mem_short[0]
-2
>>> mem_short.tolist()
[-2, -1, 1024, 1, 2]

>>> len(numbers)
5
>>> numbers[0]
-2 

從控制台的輸出可以看到memoryview的元素個數和內容與array.array是一樣的。

接下來我們將mem_short的內容轉換為‘B’類型,即unsighed char類型,並查看其內容

>>> mem_octets = mem_short.cast('B')  # type 'B': unsigned char 
>>> mem_octets.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]

把位於位置5的unsighed char內容賦值為其他值,比如4:

>>> mem_octets[5] = 4

我們並沒有對numbers 這個array實例操作,但是我們查看其內容卻發現numbers已被修改:

>>> numbers
array('h', [-2, -1, 1024, 1, 2])

從上面的示例我們可以看出如何利用memoryview來操作二進制序列。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM