記錄學習《流暢的python》的一些知識-----元組(2)
阿新 • • 發佈:2020-12-30
開始記錄我學習《流暢的python》的過程
2020.12.28
1.陣列
如果需要一個只包含數字的列表,那麼array.array比list更高效。陣列支援所有跟可序列有關的操作,包括.pop、.insert、.extend。
例:建立一個有1000萬個隨機浮點數的陣列開始,到如何把這個陣列存放到檔案裡,再到如何從檔案讀取這個陣列。
from array import array
from random import random
floats = array('d', (random() for i in range(10** 7)))
print(floats[-1])
fp = open('floats.bin', 'wb')
floats.tofile(fp)
fp.close()
floats2 = array('d')
fp = open('floats.bin', 'rb')
floats2.fromfile(fp, 10**7)
fp.close()
print(floats2[-1])
print(floats2 == floats)
執行結果:
2.記憶體檢視
memoryview是一個內建類,它能讓使用者在不復制內容的情況下操作同一個陣列的不同切片。
memoryview.cast的概念跟陣列模組類似,能用不同的方式讀寫同一塊記憶體資料。而且內容位元組不會隨意移動,它會把同一塊記憶體裡的內容打包成一個全新的memoryview物件給你。
from array import array
numbers = array('h', [-2, -1, 0 , 1 , 2])
memv = memoryview(numbers)
print(len(memv))
print(memv[0])
memv_oct = memv.cast('B')
print(memv_oct.tolist())
memv_oct[5] = 4
print(numbers)
執行結果:
把memv中的內容轉換成’B’型別,也就是無符號字元。
3.Numpy和Scipy
Numpy實現了多維同質陣列和矩陣,這些資料結構不但能處理數字,還能存放其他由使用者定義的記錄。通過Numpy,使用者能對這些資料結構裡的元素進行高效的操作。
SciPy是基於NumPy的另一個庫,它提供了很多跟科學計算有關的演算法,專為線性代數,數值積分和統計學而設計。
例:二維陣列的基本操作
import numpy
a = numpy.arange(12)
print(a)
print(type(a))
print(a.shape)
a.shape = 3, 4
print(a)
print(a[2])
print(a[2, 1])
print(a[:, 1])
print(a.transpose())
執行結果:
4.雙向佇列
利用append和pop方法,可以把列表當作棧或者佇列來用、但是刪除列表的第一個元素之類的操作是很耗時的,因為這些操作會牽扯到移動列表裡的所元素。
collections.deque類是一個執行緒安全,可以快速從兩端新增或者刪除元素的資料型別。
from _collections import deque
dq = deque(range(10), maxlen=10)
print(dq)
dq.rotate(3)
print(dq)
dq.rotate(-4)
print(dq)
dq.appendleft(-1)
print(dq)
dq.extend([11, 22, 33])
print(dq)
dq.extendleft([10, 20, 30, 40])
print(dq)
執行結果: