Python內(nèi)置數(shù)據(jù)類型list各方法的性能測(cè)試過(guò)程解析
這篇文章主要介紹了Python內(nèi)置數(shù)據(jù)類型list各方法的性能測(cè)試過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
測(cè)試環(huán)境
本文所涉及的代碼均在MacOS系統(tǒng)與CentOS7下測(cè)試,使用的Python版本為3.6.8。
測(cè)試模塊
測(cè)試用的模塊是Python內(nèi)置的timeit模塊:
timeit模塊可以用來(lái)測(cè)試一小段Python代碼的執(zhí)行速度。
Timer類
class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)
Timer是測(cè)量小段代碼執(zhí)行速度的類。
stmt參數(shù)是要測(cè)試的代碼語(yǔ)句(statment);
setup參數(shù)是運(yùn)行代碼時(shí)需要的設(shè)置;
timer參數(shù)是一個(gè)定時(shí)器函數(shù),與平臺(tái)有關(guān)。
Timer類的timeit方法
timeit.Timer.timeit(number=1000000)
Timer類中測(cè)試語(yǔ)句執(zhí)行速度的對(duì)象方法。number參數(shù)是測(cè)試代碼時(shí)的測(cè)試次數(shù),默認(rèn)為1000000次。方法返回執(zhí)行代碼的平均耗時(shí),一個(gè)float類型的秒數(shù)。
列表內(nèi)置方法的性能測(cè)試
我們知道,生成一個(gè)列表可以使用列表生成式或者append、insert、extend這些方法,現(xiàn)在我們來(lái)看一下這些方法的執(zhí)行效率:
from timeit import Timer def test_list(): lst = list(range(1000)) def test_generation(): lst = [i for i in range(1000)] def test_append(): lst = [] for i in range(1000): lst.append(i) def test_add(): lst = [] for i in range(1000): lst += [i] # 在列表的頭部insert def test_insert_zero(): lst = [] for i in range(1000): lst.insert(0,i) # 在列表的尾部insert def test_insert_end(): lst = [] for i in range(1000): lst.insert(-1,i) def test_extend(): lst = [] lst.extend(list(range(1000))) t1 = Timer("test_list()","from __main__ import test_list") print(f"test_list takes {t1.timeit(number=1000)} seconds") t2 = Timer("test_generation()","from __main__ import test_generation") print(f"test_generation takes {t2.timeit(number=1000)} seconds") t3 = Timer("test_append()","from __main__ import test_append") print(f"test_append takes {t3.timeit(number=1000)} seconds") t4 = Timer("test_add()","from __main__ import test_add") print(f"test_add takes {t4.timeit(number=1000)} seconds") t5 = Timer("test_insert_zero()","from __main__ import test_insert_zero") print(f"test_insert_zero takes {t5.timeit(number=1000)} seconds") t6 = Timer("test_insert_end()","from __main__ import test_insert_end") print(f"test_insert_end takes {t6.timeit(number=1000)} seconds") t7 = Timer("test_extend()","from __main__ import test_extend") print(f"test_extend takes {t7.timeit(number=1000)} seconds")
我們先看看在MacOS系統(tǒng)下,執(zhí)行上面這段代碼的結(jié)果:
""" test_list takes 0.012904746999993222 seconds test_generation takes 0.03530399600003875 seconds test_append takes 0.0865129750000051 seconds test_add takes 0.08066114099983679 seconds test_insert_zero takes 0.30594958500023495 seconds test_insert_end takes 0.1522782449992519 seconds test_extend takes 0.017534753999825625 seconds """
我們可以看到:直接使用list方法強(qiáng)轉(zhuǎn)的效率最高,其次是使用列表生成式,而append與直接加的方式緊隨其后并且二者的效率相當(dāng);insert方法的執(zhí)行效率最低——并且從頭插入的效率要低于從尾部插入的效率!最后我們將強(qiáng)轉(zhuǎn)的列表使用extend方法放入到新的列表中的過(guò)程效率并沒有減少多少。
然后試試在Linux系統(tǒng)下的執(zhí)行結(jié)果:
列表pop方法的性能測(cè)試
pop可以從第0各位置刪除元素,也可以從最后位置刪除元素(默認(rèn)刪除最后面的元素),現(xiàn)在我們來(lái)測(cè)試一下兩種從不同位置刪除元素的性能對(duì)比:
from timeit import Timer def test_pop_zero(): lst = list(range(2000)) for i in range(2000): lst.pop(0) def test_pop_end(): lst = list(range(2000)) for i in range(2000): lst.pop() t1 = Timer("test_pop_zero()","from __main__ import test_pop_zero") print(f"test_pop_zero takes {t1.timeit(number=1000)} seconds") t2 = Timer("test_pop_end()","from __main__ import test_pop_end") print(f"test_pop_end takes {t2.timeit(number=1000)} seconds")
在MacOS下程序的執(zhí)行結(jié)果為:
test_pop_zero takes 0.5015365449999081 seconds test_pop_end takes 0.22170215499954793 seconds
然后我們來(lái)試試Linux系統(tǒng)中的執(zhí)行結(jié)果:
可以看到:從列表的尾部刪除元素的效率要比從頭部刪除的效率高很多!
關(guān)于列表insert方法的一個(gè)小坑
如果想使用insert方法生成一個(gè)列表[0,1,2,3,4,5]的話(當(dāng)然使用insert方法效率會(huì)低很多,建議使用其他的方法)會(huì)有一個(gè)這樣的問(wèn)題,在此記錄一下:
def test_insert(): lst = [] for i in range(6): lst.insert(-1,i) print(lst) test_insert()
結(jié)果竟然是這樣的——第一個(gè)元素竟然一直在最后!
[0] [1, 0] [1, 2, 0] [1, 2, 3, 0] [1, 2, 3, 4, 0] [1, 2, 3, 4, 5, 0]
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python中內(nèi)置數(shù)據(jù)類型list,tuple,dict,set的區(qū)別和用法
- Python內(nèi)置數(shù)據(jù)類型詳解
- python基礎(chǔ)教程之基本內(nèi)置數(shù)據(jù)類型介紹
- Python語(yǔ)言內(nèi)置數(shù)據(jù)類型
- python內(nèi)置數(shù)據(jù)類型之列表操作
- python入門課程第四講之內(nèi)置數(shù)據(jù)類型有哪些
- Python的內(nèi)置數(shù)據(jù)類型中的數(shù)字
- Python內(nèi)置數(shù)據(jù)類型中的集合詳解
- python內(nèi)置數(shù)據(jù)類型使用方法和繼承關(guān)系
- 探索Python內(nèi)置數(shù)據(jù)類型的精髓與應(yīng)用
相關(guān)文章
給你一面國(guó)旗 教你用python畫中國(guó)國(guó)旗
朋友圈許多小伙伴都在發(fā):請(qǐng)給我一面五星紅旗的動(dòng)態(tài),這篇文章就主要教大家如何使用python畫中國(guó)國(guó)旗,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09python操作csv格式文件之csv.DictReader()方法
這篇文章主要介紹了python操作csv格式文件之csv.DictReader()方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06Python實(shí)現(xiàn)賬號(hào)密碼輸錯(cuò)三次即鎖定功能簡(jiǎn)單示例
這篇文章主要介紹了Python實(shí)現(xiàn)賬號(hào)密碼輸錯(cuò)三次即鎖定功能,結(jié)合實(shí)例形式分析了Python文件讀取、流程控制、數(shù)據(jù)判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03詳解程序意外中斷自動(dòng)重啟shell腳本(以Python為例)
這篇文章主要介紹了詳解程序意外中斷自動(dòng)重啟shell腳本(以Python為例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python基于二分查找實(shí)現(xiàn)求整數(shù)平方根的方法
這篇文章主要介紹了Python基于二分查找實(shí)現(xiàn)求整數(shù)平方根的方法,涉及Python的二分查找算法與數(shù)學(xué)運(yùn)算相關(guān)技巧,需要的朋友可以參考下2016-05-05淺談python函數(shù)之作用域(python3.5)
下面小編就為大家?guī)?lái)一篇淺談python函數(shù)之作用域(python3.5)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Python繪制1000響大地紅鞭炮動(dòng)態(tài)效果
俗話說(shuō)得好,這所謂放鞭炮就是來(lái)壓邪祟,除惡的,但是近幾年來(lái)都不讓放炮了,這篇文章主要介紹了Python來(lái)繪制1000響大地紅鞭炮動(dòng)態(tài)效果2023-01-01Python+FuzzyWuzzy實(shí)現(xiàn)模糊匹配的示例詳解
在日常開發(fā)工作中,經(jīng)常會(huì)遇到這樣的一個(gè)問(wèn)題:要對(duì)數(shù)據(jù)中的某個(gè)字段進(jìn)行匹配,但這個(gè)字段有可能會(huì)有微小的差異。本文將分享一個(gè)簡(jiǎn)單易用的模糊字符串匹配工具包:FuzzyWuzzy,讓你輕松解決煩惱的匹配問(wèn)題2022-04-04Python使用百度翻譯開發(fā)平臺(tái)實(shí)現(xiàn)英文翻譯為中文功能示例
這篇文章主要介紹了Python使用百度翻譯開發(fā)平臺(tái)實(shí)現(xiàn)英文翻譯為中文功能,結(jié)合實(shí)例形式分析了Python使用request請(qǐng)求與百度翻譯API接口交互實(shí)現(xiàn)翻譯功能相關(guān)操作技巧,需要的朋友可以參考下2019-08-08