Python内置库:array(简单数组)
array模塊提供了一種數(shù)組概念上的緊湊類型的實(shí)現(xiàn),數(shù)組中的元素必須為同一類型,且為基礎(chǔ)數(shù)據(jù)類型(字符、整數(shù)或浮點(diǎn)數(shù)),這些元素在內(nèi)存中是按固定大小(字節(jié))連續(xù)存儲的,相比于列表和元組類型,array模塊的實(shí)現(xiàn)更加節(jié)省內(nèi)存。但是注意,使用的時候還是需要根據(jù)實(shí)際情況來看,因?yàn)镻ython對于數(shù)字、字符串等基礎(chǔ)數(shù)據(jù)類型也是做了優(yōu)化的,不一定array模塊就更節(jié)省內(nèi)存。
>>> import sys
>>> import array
>>> num = 100000
>>> lst = list(i for i in range(num))
>>> sys.getsizeof(lst)
879840
>>> a = array.array('i', lst) # i表示數(shù)組中元素的類型,具體支持的類型見下面的表格
>>> a.itemsize # 每個元素占用的內(nèi)存大小,這里為4byte
4
>>> sys.getsizeof(a) # 可以看到,總的大小為400064=4*num+64,比list類型少了一半多
400064
array支持的數(shù)據(jù)類型(Type code為array.array的第一個參數(shù))
| 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位,這取決于運(yùn)行的系統(tǒng)。并且在Python3.9之后將棄用之前的Py_UNICODE,而使用現(xiàn)在的wchar_t,但是不影響以前Py_UNICODE的使用,因?yàn)镻y_UNICODE只是wchar_t的別名。但是會在Python4.0中棄用Py_UNICODE。
array類
array.array(typecode[, initializer]):使用typecode參數(shù)創(chuàng)建一個array對象,也可以使用initializer參數(shù)初始化一個array對象,initializer必須是一個列表、bytes-like對象或者一個可迭代的對象,不過需要注意這些對象中的元素需要和上面表格中的Python Type匹配。array對象也支持索引、切片、拼接等操作,不過前提是操作的對象的typecode都是同一種類型。
常用的方法和屬性:
typecode:array對象的typecode屬性。
itemsize:array對象中元素占用的內(nèi)存大小,單位是byte。
append(x):在array對象的末尾添加一個元素x。
buffer_info():返回一個元組(address, length),address是array對象的內(nèi)存地址,length是array對象中元素的個數(shù)。可以使用array.buffer_info()[1] * array.itemsize計算出array對象的字節(jié)數(shù)。
count(x):統(tǒng)計x在array對象中出現(xiàn)的次數(shù)。
extend(iterable):將另一個可迭代對象中的元素添加到當(dāng)前array對象的末尾,需要注意,可迭代對象的元素類型需要和當(dāng)前array對象的元素類型匹配,否則會引發(fā)TypeError。
frombytes(s):將一個字符串當(dāng)做array對象,并將其中的元素添加到當(dāng)前array對象中(就像使用fromfile(f, n)從文件中讀取出來的字符串)。(Python3.2更新:fromstring()被重命名為frombytes())。
fromfile(f, n):從文件對象中讀取n項(xiàng),添加到當(dāng)前array對象的末尾。注意,如果n超出了文件對象本身具有的item數(shù)量,則會拋出EOFError,不過文件對象中的item依然會被添加到array對象中。
fromlist(list):從將一個列表中的元素添加到當(dāng)前array對象中,如果列表中的元素類型與array對象不匹配,則會拋出異常,不過此時array對象不會被改變。
fromunicode(s):將一個Unicode字符串中的字符添加到當(dāng)前array對象中,不過此時array對象必須是'u'類型,如果s是其他類型,可以使用array.frombytes(unicodestring.encode(enc))。
index(x):返回x在array中的第一個索引。
insert(i, x):在位置i前插入值x,i允許為負(fù)值。
pop([i]):從array數(shù)組中刪除并返回索引為i的值,i默認(rèn)為-1。
remove(x):從array中移除第一個找到的值x。
reverse():反轉(zhuǎn)array中元素的順序。
tobytes():將array轉(zhuǎn)換為bytes()數(shù)組。(Python3.2更新:tostring()被重命名為tobytes())
tofile(f):將array對象所有元素寫入文件。
tolist():將array對象轉(zhuǎn)換為list對象。
tounicode():將array對象轉(zhuǎn)換為Unicode字符串,注意,此時array對象必須是'u'類型,如果是其他類型,可以使用array.tobytes().decode(enc)來獲取一個Unicode字符串。
總結(jié)
以上是生活随笔為你收集整理的Python内置库:array(简单数组)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Julia 入门学习教程
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?