我們已知python是具有非常多的包一種開源語言,封裝了各種算法。 python典型的數據結構為列表/元組/字符串/字典,與C/C++中的數組(array)/ 棧(stack) /(優先)隊列”(queue) / 二叉樹(binary tree)有明顯區別。 在python官網中指出,列表可以作為棧和隊列使用,但是并未給出特別詳細具體的教程。 在python官網上有關于list和dict數據結構的描述參考,如鏈接所示,但是沒有關于時間復雜度和空間復雜度的分析。本文是對官網內容一個實例化和補充 官網鏈接:https://docs.python.org/zh-cn/3/tutorial/datastructures.html 本文內容部分參考:嗶哩嗶哩網站上“自學IT工程師”的“python學習教程之數據結構和算法基礎” 具體參考鏈接:https://www.bilibili.com/video/av46256220/?p=6 https://www.bilibili.com/video/av46256220/?p=7 根據這一系列的教程,將在系列文章中給出與C語言中的數據結構逐一對應的python解法 測算一小段代碼的執行速度采用timeit這個包,timeit用法參考:https://docs.python.org/3/library/timeit.html
常用的參數定義為:
class timeit.Timer(stmt ='pass',setup ='pass',timer =
,globals = None )
用法的簡單示例為:
timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()
?
測算生成list的算法效率
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]
def t3():
li = [i for i in range(10000)]
def t4():
li = list(range(10000))
def t5():
for i in range(10000):
li.extend([i])
def t6():
li = []
for i in range(10000):
li.insert(0,i)
# 采用timeit測算一小段代碼的運行速度
# 追加操作
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('insert :',timer6.timeit(1000))
輸出結果為
.append: 0.7118582189999999
+: 114.38965233500001
[i for i in range]: 0.3101561069999974
list(range()): 0.16905038100000525
extend: 1.4377866079999961
insert : 30.547064246999994
從以上輸出結果可以看出,字符串‘+’操作的速度最慢,在循環次數多的時間特別明顯,所以盡量避免使用;追加操作和列表生成器的速度相當,建議采納,擴展的速度稍慢,但也可以;插入操作特別是從頭部插入操作,因為后面所有的元素都要向后移動一位,所以速度最慢。 絕大部分情況下,我們更關注算法的時間復雜度。 除了以上引用到的列表(list)的方法以外,list和dict還有很多內置操作,他們的時間復雜度如下所示。 List 內置操作的時間復雜度 Operation Big-O Efficiency index[] O(1) index assignment O(1) append O(1) pop() O(1) pop(i) O(n) insert() O(n) del operator O(n) iteration O(n) contains(in) O(n) get slice O(n) set slice O(n+k) reversed O(n) concatenate O(n) sort O(nlogn) multiply O(nk) dict 內置操作的時間復雜度 operation Big-O Effeciency copy O(n) get item O(1) set item O(1) contains(in) O(1) iteration O(1)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
