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字符串。