列表與字典內置操作的時間複雜度------ Python數據結構與算法第2章

1. 性能分析模塊 timeit

timeit模塊可以用來測試一小段Python代碼的執行速度,Timeit模塊中的Timer類是測量小段代碼執行速度的類,使用方法:timeid.Timer(stmt='pass', setup='pass', timer=<timer function>)。stmt參數是要測試的代碼語句;setup參數是運行代碼時需要的設置;timer參數是一個定時器函數,與平臺有關。Timer類中測試語句執行速度的對象方法:timeit.Timer.timeit(number=1000000) 。number參數是測試代碼時的測試次數,默認爲1000000次。方法返回執行代碼的平均耗時,一個float類型的秒數。

2. 列表操性能測試

測試列表的生成效率,list(range(10000)) 是執行效率最高的,兩個列表向加 lst + [i] 執行效率最小的!所以,強烈不建議使用列表向加。

import timeit

def test01():
    lst = []
    for i in range(10000):
        lst.append(i)

def test02():
    lst = []
    for i in range(10000):
        lst = lst + [i]  # 這裏使用+是直接對兩個列表進行+操作,與+=不一樣。lst+[i]得到的結果賦給新的列表(需要重新創建),lst指向這裏新的列表

def test03():
    lst = [i for i in range(10000)]

def test04():
    lst = list(range(10000))

def test05():
    lst = []
    for i in range(10000):
        lst.extend([i])  # 相當於+=

timer01 = timeit.Timer(stmt='test01()', setup='from __main__ import test01')
print(timer01.timeit(number=1000))
timer02 = timeit.Timer(stmt='test02()', setup='from __main__ import test02')
print(timer02.timeit(number=1000))
timer03 = timeit.Timer(stmt='test03()', setup='from __main__ import test03')
print(timer03.timeit(number=1000))
timer04 = timeit.Timer(stmt='test04()', setup='from __main__ import test04')
print(timer04.timeit(number=1000))
timer05 = timeit.Timer(stmt='test05()', setup='from __main__ import test05')
print(timer05.timeit(number=1000))
"""
0.45439891899877694
111.16130047300248
0.3060263489969657
0.16354428199701943
1.0356771610022406
"""

測試添加列表元素,一個是從列表頭追加,一個是從列表尾部追加。很顯然從列表尾部追加效率最高:

import timeit

def test06():
    lst = []
    for i in range(10000):
        lst.append(i)

def test07():
    lst = []
    for i in range(10000):
        lst.insert(0, i) # 

timer06 = timeit.Timer(stmt='test06()', setup='from __main__ import test06')
print(timer06.timeit(number=1000))
timer07 = timeit.Timer(stmt='test07()', setup='from __main__ import test07')
print(timer07.timeit(number=1000))
"""
0.5252876660015318
18.104313356001512
"""

pop操作測試,從結果可以看出,pop最後一個元素的效率遠遠高於pop第一個元素

from timeit import Timer

x = list(range(2000000))
pop_zero = Timer("x.pop(0)", "from __main__ import x")
print("pop_zero ", pop_zero.timeit(number=1000))
x = list(range(2000000))
pop_end = Timer("x.pop()", "from __main__ import x")
print("pop_end ", pop_end.timeit(number=1000))
"""
pop_zero  1.444499523997365
pop_end  5.205700290389359e-05
"""
3. 列表內置操作的時間複雜度

index和append以及pop()的時間複雜度是O(1),pop(i)和insert(i,item)以及contains(in)是O(n)。
在這裏插入圖片描述

4. 字典內置操作的時間複雜度

在這裏插入圖片描述

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