Python封裝了很好用的結構和方法,爲啥還要學數據結構?

前言

大家前面學過Python基礎知識的都知道,Python爲我們封裝了列表、字典等高級數據類型,並且他們都帶有一系列增、刪、改、除的方法,讓我們能夠很方便的處理一些問題。以目前我們這些人的技術水平可能覺得這些東西就夠了,照樣能夠快速的解決很多的問題。可是隨着知識的深入,隨着問題不斷地變難,很多時候我們去用列表、字典這些高級數據類型來解決問題得話可能顯得有點力不從心。世界上沒有無用的知識,也沒有無用的的人!其實你通過深入的學習之後會發現,數據結構這門課程是獨立於語言之外的,管他是用什麼語言實現,裏面的道道都是一樣的,至於用Python這門語言來實現的話,他是否會簡單一些,這還有待我們深入的去學習和了解。

Python內置數據類型性能分析

下面我們將結合Python中的timeit模塊來深入的分析一下,Python中內置的列表、字典等數據類型的性能,對此你可能會對數據結構的深入學習有更強的期待。

timeit模塊

timeit模塊可以用來測試一小段Python代碼的執行速度。
Python中timeit模塊定義了接受兩個參數的Timer類。兩個參數都是字符串,第一個參數是你要計時的語句或者函數,第二個參數是爲第一個參數構建環境的導入語句,也就是第一個參數所在的地方,一般是import語句“from __ main __ inport …”。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)

總結來說:
Timer是測量小段代碼執行速度的類。
stmt參數是要測試的代碼語句(statment);
setup參數是運行代碼時需要的設置;
timer參數是一個定時器函數,與平臺有關。
timeit.Timer.timeit(number=1000000)
Timer類中測試語句執行速度的對象方法。number參數是測試代碼時的測試次數,默認爲100萬次。方法返回執行代碼的平均耗時,一個浮點類型的秒數。

列表內置方法性能分析

下面使用timeit模塊中的Timer類來試驗一下列表中的各種方法類型的運行時間,找出時間複雜度最低的方法:

from timeit import Timer
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])

def t7():
    li = []
    for i in range(10000):
        li.insert(0, i)


timer1 = Timer("t1()", "from __main__ import t1")
print("append:", timer1.timeit(1000))

timer2 = Timer("t2()", "from __main__ import t2")
print("+:", timer2.timeit(1000))

timer3 = Timer("t3()", "from __main__ import t3")
print("[i for i in range]:", timer3.timeit(1000))

timer4 = Timer("t4()", "from __main__ import t4")
print("list(range()):", timer4.timeit(1000))

timer5 = Timer("t5()", "from __main__ import t5")
print("extend:", timer5.timeit(1000))

timer6 = Timer("t6()", "from __main__ import t6")
print("append", timer6.timeit(1000))

timer7 = Timer("t7()", "from __main__ import t7")
print("insert(0)", timer7.timeit(1000))

在這裏插入圖片描述
通過以上試驗可以發現使用列表生成器的代碼的時間複雜度是比較低的,其中+這個操作的時間複雜度較高,原因在於在做+操作時,每兩個列表元素相加都會生成第三個列表來儲存相加好了的列表元素,加一次就在內存中生成一個列表,如此下來會造成大量的內存得不到釋放,嚴重佔用內存空間,且每一步的操作都很費時。

列表內置操作的時間複雜度

列表內置操作的時間複雜度如下圖所示:
在這裏插入圖片描述

字典內置操作時間複雜度

列表內置操作的時間複雜度如下圖所示:
在這裏插入圖片描述

最後

某些代碼和圖片來源於我學習的資料。講到這裏或許大家還是不明白我們爲什麼要學數據結構,更高級的數據結構有什麼好處等一系列問題。

我們爲了解決問題,需要將數據保存下來,然後根據數據的存儲方式來設計算法實現進行處理,那麼數據的存儲方式不同就會導致需要不同的算法進行處理。我們希望算法解決問題的效率越快越好,於是我們就需要考慮數據究竟如何保存的問題,這就是數據結構。

其實看到這裏,列表字典本身就是一種數據結構,只不過是Python封裝好了的,其他的高級數據結構類型則需要我們自己去實現,實現的過程就是我們對計算機知識更深入的瞭解!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章