1. 程式人生 > >2 timeit模塊,python中數據結構

2 timeit模塊,python中數據結構

ber 字典 如果 數據對象 之間 時間復雜度 測量模塊 算法 很多

1、timeit模塊:代碼事件測量模塊

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類型的秒數。

2、python列表操作的事件效率

(1)list生成方式比較

技術分享圖片

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))

技術分享圖片技術分享圖片

技術分享圖片

(2)pop操作測試

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第一個元素

可以自行嘗試下list的append(value)和insert(0,value),即一個後面插入和一個前面插入???

3、list與dict的時間復雜度

技術分享圖片技術分享圖片

技術分享圖片技術分享圖片

技術分享圖片技術分享圖片技術分享圖片

4、引入數據結構

我們如何用Python中的類型來保存一個班的學生信息? 如果想要快速的通過學生姓名獲取其信息呢?

技術分享圖片技術分享圖片技術分享圖片

列表和字典都可以存儲一個班的學生信息,但是想要在列表中獲取一名同學的信息時,就要遍歷這個列表,其時間復雜度為O(n),

而使用字典存儲時,可將學生姓名作為字典的鍵,學生信息作為值,進而查詢時不需要遍歷便可快速獲取到學生信息,其時間復雜度為O(1)。

技術分享圖片技術分享圖片

這樣的數據組織方式,我們就把他叫做數據結構 

組織方式不同,數據結構不同

數據結構解決的一組數據如何保存,它的保存形式是什麽樣式

技術分享圖片

在上面的問題中我們可以選擇Python中的列表或字典來存儲學生信息。列表和字典就是Python內建幫我們封裝好的兩種數據結構。

5、數據結構概念

數據是一個抽象的概念,將其進行分類後得到程序設計語言中的基本類型。如:int,float,char等。數據元素之間不是獨立的,存在特定的關系,這些關系便是結構。

數據結構指數據對象中數據元素之間的關系。

Python給我們提供了很多現成的數據結構類型,這些系統自己定義好的,不需要我們自己去定義的數據結構叫做Python的內置數據結構,比如列表、元組、字典。

而有些數據組織方式,Python系統裏面沒有直接定義,需要我們自己去定義實現這些數據的組織方式,這些數據組織方式稱之為Python的擴展數據結構,比如棧,隊列等。

6、算法與數據結構的區別

數據結構只是靜態的描述了數據元素之間的關系。

高效的程序需要在數據結構的基礎上設計和選擇算法。

程序 = 數據結構 + 算法

總結:算法是為了解決實際問題而設計的,數據結構是算法需要處理的問題載體

  

7、抽象數據類型(Abstract Data Type)

抽象數據類型(ADT)的含義是指一個數學模型以及定義在此數學模型上的一組操作。即把數據類型和數據類型上的運算捆在一起,進行封裝。

引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。

最常用的數據運算有五種:

  • 插入
  • 刪除
  • 修改
  • 查找
  • 排序

技術分享圖片

2 timeit模塊,python中數據結構