關於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來操作二進制序列。
