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