python memoryview_memoryview的用法
本來第一次看《流暢的python》覺得這部分沒用,就跳過去,后面又出現(xiàn),回頭看還是一知半解,查了諸多資料,好像有一點明白了,立下帖子。
1、memoryview
memoryview()
函數(shù)返回給定參數(shù)的內(nèi)存查看對象(memory view)。
所謂內(nèi)存查看對象,是指對支持緩沖區(qū)協(xié)議的數(shù)據(jù)進行包裝,在不需要復制對象基礎(chǔ)上允許Python代碼訪問。
可以簡單理解為就是對內(nèi)存地址的直接訪問。
memoryview可以對對象進行索引或者切片,不過切片的返回結(jié)果為一個子memoryview對象:
import array
# 創(chuàng)建一個signed short 類型數(shù)組,占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在內(nèi)存中的表示形式,但是屬于不同的對象:
>>>mem is nums
False
>>>mem == nums
True
同樣,memoryview對象有tolist方法可以轉(zhuǎn)換為列表:
>>>mem.tolist()
[-2, -1, 0, 1, 2]
2、memoryview.cast
memoryview.cast
會把同一塊內(nèi)存里的內(nèi)容打包成一個全新的memoryview對象。
>>>mem_oct = mem.cast('B')
>>>mem.nbytes == mem_oct.nbytes
True
>>>mem.itemsize == mem_oct.itemsize
False
在轉(zhuǎn)換以后,所占字節(jié)數(shù)保持不變,但是單個元素的所占字節(jié)由原來的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轉(zhuǎn)換為list,你會發(fā)現(xiàn)mem_oct居然包含10個元素:
>>>mem_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
所包含的元素也很奇怪,這個就涉及到存儲的一些知識,為了將將符號位和數(shù)值域統(tǒng)一處理,同時加法和減法也可以統(tǒng)一處理,計算機系統(tǒng)中數(shù)值一律用補碼來表示和存儲。
以-2為例,初始設(shè)置其數(shù)據(jù)類型為占用兩個字節(jié)的’long’,其原碼是1000 0000 0000 0010,而在計算機存儲的是1111 1111 1111 1110,其低八位為254,高8位為255,所以知道m(xù)em_oct前兩個元素從哪里來了吧。
對于2來說,原碼為0000 0000 0000 0010,補碼為其本身(正數(shù)的補碼與原碼一致),所以轉(zhuǎn)換后為2,0。
歡迎關(guān)注我的微信公眾號
總結(jié)
以上是生活随笔為你收集整理的python memoryview_memoryview的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机应用基础第九章在线测试答案,郑大计
- 下一篇: 跑分cpu_一加8T现身跑分网站:CPU