當我們需要1000萬個浮點數的時候,數組(array)的效率要比列表(list)要高得多,因為數組在背后存的並不是float對象,而是數字的機器翻譯,也就是字節表述。這一點和c語言中的數組一樣。
再比如說,如果需要頻繁對序列做先出先進的操作,collection.deque(雙端隊列)的速度應該會更快。
1.數組
如果我們需要一個只包含數字的列表,那么array.array比list更高效。數組支持所有跟可變序列有關的操作,包括.pop,.insert和.extend。
另外,數組還提供從文件讀取和存入文件的更快的方法,如.frombytes和.tofile。
Python數組跟C語言數組一樣精簡。創建數組需要一個類型碼,這個類型碼用來表示在底層的C語言應該存放怎樣的數據類型。比如b類型碼代表的是有符號的字符(signedchar),array('b')創建出的數組就只能存放一個字節大小的整數,范圍從-128到127,這樣在序列很大的時候,我們能節省很多空間。
array類型碼如下:
Type code C Type Minimum size in bytes 'b' signed integer 1 'B' unsigned integer 1 'u' Unicode character 2 'h' signed integer 2 'H' unsigned integer 2 'i' signed integer 2 'I' unsigned integer 2 'l' signed integer 4 'L' unsigned integer 4 'q' signed integer 8 'Q' unsigned integer 8 'f' floating point 4 'd' floating point 8
一個浮點型的數組的創建,存入文件和文件讀取的過程:
>>> from array import array >>> from random import random >>> floats = array('d', (random() for i in range(10**7))) >>> floats[-1] 0.021901117799701275 >>> fp = open('floats.bin', 'wb') >>> floats.tofile(fp) >>> fp.close() >>> floats_2 = array('d') >>> fp = open('floats.bin', 'rb') >>> floats_2.fromfile(fp, 10**7) >>> fp.close() >>> floats_2[-1] 0.021901117799701275 >>> floats_2 == floats True
array創建的數組不適用於數字操作(比如矩陣和矢量運算)。另外+=和*=運算符可以用於array的添加。
從python3.4開始,數組(array)類型不再支持諸如list.sort()這種就地排序方法。要給數組排序的話,得用sorted函數新建一個數組:
>>> import array >>> a = array.array(a.typecode, sorted(a))
