欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python內(nèi)置數(shù)據(jù)類型list各方法的性能測(cè)試過(guò)程解析

 更新時(shí)間:2020年01月07日 11:44:08   作者:千里駿骨  
這篇文章主要介紹了Python內(nèi)置數(shù)據(jù)類型list各方法的性能測(cè)試過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python自動(dòng)生成HTML的方法示例

    使用Python自動(dòng)生成HTML的方法示例

    這篇文章主要介紹了使用Python自動(dòng)生成HTML的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 給你一面國(guó)旗 教你用python畫中國(guó)國(guó)旗

    給你一面國(guó)旗 教你用python畫中國(guó)國(guó)旗

    朋友圈許多小伙伴都在發(fā):請(qǐng)給我一面五星紅旗的動(dòng)態(tài),這篇文章就主要教大家如何使用python畫中國(guó)國(guó)旗,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • python操作csv格式文件之csv.DictReader()方法

    python操作csv格式文件之csv.DictReader()方法

    這篇文章主要介紹了python操作csv格式文件之csv.DictReader()方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Python實(shí)現(xiàn)賬號(hào)密碼輸錯(cuò)三次即鎖定功能簡(jiǎn)單示例

    Python實(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為例)

    這篇文章主要介紹了詳解程序意外中斷自動(dòng)重啟shell腳本(以Python為例),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python基于二分查找實(shí)現(xiàn)求整數(shù)平方根的方法

    Python基于二分查找實(shí)現(xiàn)求整數(shù)平方根的方法

    這篇文章主要介紹了Python基于二分查找實(shí)現(xiàn)求整數(shù)平方根的方法,涉及Python的二分查找算法與數(shù)學(xué)運(yùn)算相關(guān)技巧,需要的朋友可以參考下
    2016-05-05
  • 淺談python函數(shù)之作用域(python3.5)

    淺談python函數(shù)之作用域(python3.5)

    下面小編就為大家?guī)?lái)一篇淺談python函數(shù)之作用域(python3.5)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Python繪制1000響大地紅鞭炮動(dòng)態(tài)效果

    Python繪制1000響大地紅鞭炮動(dòng)態(tài)效果

    俗話說(shuō)得好,這所謂放鞭炮就是來(lái)壓邪祟,除惡的,但是近幾年來(lái)都不讓放炮了,這篇文章主要介紹了Python來(lái)繪制1000響大地紅鞭炮動(dòng)態(tài)效果
    2023-01-01
  • Python+FuzzyWuzzy實(shí)現(xiàn)模糊匹配的示例詳解

    Python+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-04
  • Python使用百度翻譯開發(fā)平臺(tái)實(shí)現(xiàn)英文翻譯為中文功能示例

    Python使用百度翻譯開發(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

最新評(píng)論