python memoryview_memoryview的用法
本來第一次看《流暢的python》覺得這部分沒用,就跳過去,后面又出現,回頭看還是一知半解,查了諸多資料,好像有一點明白了,立下帖子。
1、memoryview
memoryview()
函數返回給定參數的內存查看對象(memory view)。
所謂內存查看對象,是指對支持緩沖區協議的數據進行包裝,在不需要復制對象基礎上允許Python代碼訪問。
可以簡單理解為就是對內存地址的直接訪問。
memoryview可以對對象進行索引或者切片,不過切片的返回結果為一個子memoryview對象:
import array
# 創建一個signed short 類型數組,占2bytes
nums = array.array('h', list(range(-2, 3)))
mem = memoryview(nums)
print(len(mem)) # 5
print(mem[0]) # -2
print(mem[1:4]) #
mem相當于nums在內存中的表示形式,但是屬于不同的對象:
>>>mem is nums
False
>>>mem == nums
True
同樣,memoryview對象有tolist方法可以轉換為列表:
>>>mem.tolist()
[-2, -1, 0, 1, 2]
2、memoryview.cast
memoryview.cast
會把同一塊內存里的內容打包成一個全新的memoryview對象。
>>>mem_oct = mem.cast('B')
>>>mem.nbytes == mem_oct.nbytes
True
>>>mem.itemsize == mem_oct.itemsize
False
在轉換以后,所占字節數保持不變,但是單個元素的所占字節由原來的2個變成1個(‘h’ --> ‘B’)。
Type code
C Type
Python Type
Minimum size in bytes
‘c’
char
character
1
‘b’
signed char
int
1
‘B’
unsigned char
int
1
‘u’
Py_UNICODE
Unicode character
2 (see note)
‘h’
signed short
int
2
‘H’
unsigned short
int
2
‘i’
signed int
int
2
‘I’
unsigned int
long
2
‘l’
signed long
int
4
‘L’
unsigned long
long
4
‘f’
float
float
4
‘d’
double
float
8
將mem_oct轉換為list,你會發現mem_oct居然包含10個元素:
>>>mem_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
所包含的元素也很奇怪,這個就涉及到存儲的一些知識,為了將將符號位和數值域統一處理,同時加法和減法也可以統一處理,計算機系統中數值一律用補碼來表示和存儲。
以-2為例,初始設置其數據類型為占用兩個字節的’long’,其原碼是1000 0000 0000 0010,而在計算機存儲的是1111 1111 1111 1110,其低八位為254,高8位為255,所以知道mem_oct前兩個元素從哪里來了吧。
對于2來說,原碼為0000 0000 0000 0010,補碼為其本身(正數的補碼與原碼一致),所以轉換后為2,0。
歡迎關注我的微信公眾號
總結
以上是生活随笔為你收集整理的python memoryview_memoryview的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用基础第九章在线测试答案,郑大计
- 下一篇: websocket python爬虫_p