array模塊提供了一種陣列概念上的緊湊型別的實作,陣列中的元素必須為同一型別,且為基礎資料型別(字符、整數或浮點數),這些元素在記憶體中是按固定大小(位元組)連續存盤的,相比于串列和元組型別,array模塊的實作更加節省記憶體,但是注意,使用的時候還是需要根據實際情況來看,因為Python對于數字、字串等基礎資料型別也是做了優化的,不一定array模塊就更節省記憶體,
>>> import sys
>>> import array
>>> num = 100000
>>> lst = list(i for i in range(num))
>>> sys.getsizeof(lst)
879840
>>> a = array.array('i', lst) # i表示陣列中元素的型別,具體支持的型別見下面的表格
>>> a.itemsize # 每個元素占用的記憶體大小,這里為4byte
4
>>> sys.getsizeof(a) # 可以看到,總的大小為400064=4*num+64,比list型別少了一半多
400064
array支持的資料型別(Type code為array.array的第一個引數)
| Type code | C Type | Python Type | Minimun size in bytes |
|---|---|---|---|
| 'b' | signed char | int | 1 |
| 'B' | unsigned char | int | 1 |
| 'u' | wchar_t | Unicode character | 2 |
| 'h' | signed short | int | 2 |
| 'H' | unsigned short | int | 2 |
| 'i' | signed int | int | 2 |
| 'I' | unsigned int | int | 2 |
| 'l' | signed long | int | 4 |
| 'L' | unsigned long | int | 4 |
| 'q' | signed long long | int | 8 |
| 'Q' | unsigned long long | int | 8 |
| 'f' | float | float | 4 |
| 'd' | double | float | 8 |
注:array('u')可能是16位或者32位,這取決于運行的系統,并且在Python3.9之后將棄用之前的Py_UNICODE,而使用現在的wchar_t,但是不影響以前Py_UNICODE的使用,因為Py_UNICODE只是wchar_t的別名,但是會在Python4.0中棄用Py_UNICODE,
array類
array.array(typecode[, initializer]):使用typecode引數創建一個array物件,也可以使用initializer引數初始化一個array物件,initializer必須是一個串列、bytes-like物件或者一個可迭代的物件,不過需要注意這些物件中的元素需要和上面表格中的Python Type匹配,array物件也支持索引、切片、拼接等操作,不過前提是操作的物件的typecode都是同一種型別,
常用的方法和屬性:
- typecode:array物件的typecode屬性,
- itemsize:array物件中元素占用的記憶體大小,單位是byte,
- append(x):在array物件的末尾添加一個元素x,
- buffer_info():回傳一個元組
(address, length),address是array物件的記憶體地址,length是array物件中元素的個數,可以使用array.buffer_info()[1] * array.itemsize計算出array物件的位元組數, - count(x):統計x在array物件中出現的次數,
- extend(iterable):將另一個可迭代物件中的元素添加到當前array物件的末尾,需要注意,可迭代物件的元素型別需要和當前array物件的元素型別匹配,否則會引發TypeError,
- frombytes(s):將一個字串當做array物件,并將其中的元素添加到當前array物件中(就像使用fromfile(f, n)從檔案中讀取出來的字串),(Python3.2更新:fromstring()被重命名為frombytes()),
- fromfile(f, n):從檔案物件中讀取n項,添加到當前array物件的末尾,注意,如果n超出了檔案物件本身具有的item數量,則會拋出EOFError,不過檔案物件中的item依然會被添加到array物件中,
- fromlist(list):從將一個串列中的元素添加到當前array物件中,如果串列中的元素型別與array物件不匹配,則會拋出例外,不過此時array物件不會被改變,
- fromunicode(s):將一個Unicode字串中的字符添加到當前array物件中,不過此時array物件必須是
'u'型別,如果s是其他型別,可以使用array.frombytes(unicodestring.encode(enc)), - index(x):回傳x在array中的第一個索引,
- insert(i, x):在位置i前插入值x,i允許為負值,
- pop([i]):從array陣列中洗掉并回傳索引為i的值,i默認為-1,
- remove(x):從array中移除第一個找到的值x,
- reverse():反轉array中元素的順序,
- tobytes():將array轉換為bytes()陣列,(Python3.2更新:tostring()被重命名為tobytes())
- tofile(f):將array物件所有元素寫入檔案,
- tolist():將array物件轉換為list物件,
- tounicode():將array物件轉換為Unicode字串,注意,此時array物件必須是
'u'型別,如果是其他型別,可以使用array.tobytes().decode(enc)來獲取一個Unicode字串,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272432.html
標籤:Python
