timeit模塊能夠用來測試一小段Python代碼的執行速度。
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>) Timer是測量小段代碼執行速度的類。 stmt參數是要測試的代碼語句(statment); setup參數是運行代碼時須要的設置; timer參數是一個定時器函數,與平臺有關。
timeit.Timer.timeit(number=1000000)
Timer類中測試語句執行速度的對象方法。
number參數是測試代碼時的測試次數,默認爲1000000次。
方法返回執行代碼的平均耗時,一個float類型的秒數。
def t1(): li = [] for i in range(10000): li.append(i) def t2(): li = [] for i in range(10000): li = li + [i] # li += [i] def t3(): li = [i for i in range(10000)] def t4(): li = list(range(10000)) def t5(): li = [] for i in range(10000): li.extend([i]) from timeit import Timer timer1 = Timer("t1()", "from __main__ import t1") # "t1()" 要檢測的函數(str), # "from __main__ import t1" 從哪一個文件導入 print("append-->", timer1.timeit(1000)) # number參數是測試代碼時的測試次數 timer2 = Timer("t2()", "from __main__ import t2") print("+ -->", timer1.timeit(1000)) timer3 = Timer("t3()", "from __main__ import t3") print("[i for i in range(10000)]-->", timer1.timeit(1000)) timer4 = Timer("t4()", "from __main__ import t4") print("list(range(10000))-->", timer1.timeit(1000)) timer5 = Timer("t5()", "from __main__ import t5") print("list(extend(10000))-->", timer1.timeit(1000))
x = range(2000000) pop_zero = Timer("x.pop(0)","from __main__ import x") print("pop_zero ",pop_zero.timeit(number=1000), "seconds") x = range(2000000) pop_end = Timer("x.pop()","from __main__ import x") print("pop_end ",pop_end.timeit(number=1000), "seconds") # ('pop_zero ', 1.9101738929748535, 'seconds') # ('pop_end ', 0.00023603439331054688, 'seconds')
測試pop操做:從結果能夠看出,pop最後一個元素的效率遠遠高於pop第一個元素python
能夠自行嘗試下list的append(value)和insert(0,value),即一個後面插入和一個前面插入???算法
咱們如何用Python中的類型來保存一個班的學生信息? 若是想要快速的經過學生姓名獲取其信息呢?數據結構
列表和字典均可以存儲一個班的學生信息,可是想要在列表中獲取一名同窗的信息時,就要遍歷這個列表,其時間複雜度爲O(n),app
而使用字典存儲時,可將學生姓名做爲字典的鍵,學生信息做爲值,進而查詢時不須要遍歷即可快速獲取到學生信息,其時間複雜度爲O(1)。函數
這樣的數據組織方式,咱們就把他叫作數據結構 組織方式不一樣,數據結構不一樣 數據結構解決的一組數據如何保存,它的保存形式是什麼樣式
在上面的問題中咱們能夠選擇Python中的列表或字典來存儲學生信息。列表和字典就是Python內建幫咱們封裝好的兩種數據結構。測試
數據是一個抽象的概念,將其進行分類後獲得程序設計語言中的基本類型。如:int,float,char等。數據元素之間不是獨立的,存在特定的關係,這些關係即是結構。spa
數據結構指數據對象中數據元素之間的關係。設計
Python給咱們提供了不少現成的數據結構類型,這些系統本身定義好的,不須要咱們本身去定義的數據結構叫作Python的內置數據結構,好比列表、元組、字典。3d
而有些數據組織方式,Python系統裏面沒有直接定義,須要咱們本身去定義實現這些數據的組織方式,這些數據組織方式稱之爲Python的擴展數據結構,好比棧,隊列等。code
數據結構只是靜態的描述了數據元素之間的關係。
高效的程序須要在數據結構的基礎上設計和選擇算法。
程序 = 數據結構 + 算法
總結:算法是爲了解決實際問題而設計的,數據結構是算法須要處理的問題載體
抽象數據類型(ADT)的含義是指一個數學模型以及定義在此數學模型上的一組操做。即把數據類型和數據類型上的運算捆在一塊兒,進行封裝。
引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。
最經常使用的數據運算有五種: