<strike id="cakm0"></strike>
  • <button id="cakm0"><dl id="cakm0"></dl></button>
  • <samp id="cakm0"><tbody id="cakm0"></tbody></samp>
    <samp id="cakm0"><pre id="cakm0"></pre></samp><ul id="cakm0"></ul>
    <strike id="cakm0"></strike>
    <li id="cakm0"></li>
  • <ul id="cakm0"></ul>
  • 更多精彩內(nèi)容,歡迎關(guān)注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

    提升Python運行速度的5個小技巧

    文檔

    提升Python運行速度的5個小技巧

    雖然Python代碼運行緩慢,但可以通過下面分享的5個小技巧提升Python運行速度!1. 選擇合適的數(shù)據(jù)結(jié)構(gòu)。2. 善用強大的內(nèi)置函數(shù)和第三方庫。3. 少用循環(huán)。4. 避免循環(huán)重復計算。5. 少用內(nèi)存、少用全局變量。
    推薦度:
    導讀雖然Python代碼運行緩慢,但可以通過下面分享的5個小技巧提升Python運行速度!1. 選擇合適的數(shù)據(jù)結(jié)構(gòu)。2. 善用強大的內(nèi)置函數(shù)和第三方庫。3. 少用循環(huán)。4. 避免循環(huán)重復計算。5. 少用內(nèi)存、少用全局變量。

    Python 是世界上使用最廣泛的編程語言之一。它是一種解釋型高級通用編程語言,具有廣泛的用途,幾乎可以將其用于所有事物。其以簡單的語法、優(yōu)雅的代碼和豐富的第三方庫而聞名。python除了有很多優(yōu)點外,但在速度上還有一個非常大的缺點。

    雖然Python代碼運行緩慢,但可以通過下面分享的5個小技巧提升Python運行速度!

    首先,定義一個計時函數(shù)timeshow,通過簡單的裝飾,可以打印指定函數(shù)的運行時間。

    這個函數(shù)在下面的例子中會被多次使用。

    def?timeshow(func):
    ????from?time?import?time
    ????def?newfunc(*arg,?**kw):
    ????????t1?=?time()
    ????????res?=?func(*arg,?**kw)
    ????????t2?=?time()
    ????????print(f"{func.__name__:?>10}?:?{t2-t1:.6f}?sec")
    ????????return?res
    ????return?newfunc
    @timeshow
    def?test_it():
    ????print("hello?pytip")
    test_it()
    1. 選擇合適的數(shù)據(jù)結(jié)構(gòu)

    使用正確的數(shù)據(jù)結(jié)構(gòu)對python腳本的運行時間有顯著影響。Python 有四種內(nèi)置的數(shù)據(jù)結(jié)構(gòu):

    列表: List

    元組: Tuple

    集合: Set

    字典: Dictionary

    但是,大多數(shù)開發(fā)人員在所有情況下都使用列表。這是不正確的做法,應該根據(jù)任務使用合適數(shù)據(jù)結(jié)構(gòu)。

    運行下面的代碼,可以看到元組執(zhí)行簡單檢索操作的速度比列表快。其中dis模塊反匯編了一個函數(shù)的字節(jié)碼,這有利于查看列表和元組之間的區(qū)別。

    import?dis
    def?a():
    ????data?=?[1,?2,?3,?4,?5,6,7,8,9,10]
    ????x?=data[5]
    ????return?x
    def?b():
    ????data?=?(1,?2,?3,?4,?5,6,7,8,9,10)
    ????x?=data[5]
    ????return?x
    print("-----:使用列表的機器碼:------")
    dis.dis(a)
    print("-----:使用元組的機器碼:------")
    dis.dis(b)

    運行輸出:

    -----:使用列表的機器碼:------3 0 LOAD_CONST 1 (1)2 LOAD_CONST 2 (2)4 LOAD_CONST 3 (3)6 LOAD_CONST 4 (4)8 LOAD_CONST 5 (5)10 LOAD_CONST 6 (6)12 LOAD_CONST 7 (7)14 LOAD_CONST 8 (8)16 LOAD_CONST 9 (9)18 LOAD_CONST 10 (10)20 BUILD_LIST 1022 STORE_FAST 0 (data)4 24 LOAD_FAST 0 (data)26 LOAD_CONST 5 (5)28 BINARY_SUBSCR30 STORE_FAST 1 (x)5 32 LOAD_FAST 1 (x)34 RETURN_VALUE-----:使用元組的機器碼:------7 0 LOAD_CONST 1 ((1, 2, 3, 4, 5, 6, 7, 8, 9, 10))2 STORE_FAST 0 (data)8 4 LOAD_FAST 0 (data)6 LOAD_CONST 2 (5)8 BINARY_SUBSCR10 STORE_FAST 1 (x)9 12 LOAD_FAST 1 (x)14 RETURN_VALUE

    看下列表的機器碼,冗長而多余!

    2. 善用強大的內(nèi)置函數(shù)和第三方庫

    如果你正在使用python并且仍在自己編寫一些通用函數(shù)(比如加法、減法),那么是在侮辱python。 Python有大量的庫和內(nèi)置函數(shù)來幫助你不用編寫這些函數(shù)。 如果研究下,那么你會驚奇地發(fā)現(xiàn)幾乎90%的問題已經(jīng)有第三方包或內(nèi)置函數(shù)來解決。

    可以通過訪問官方文檔查看所有內(nèi)置函數(shù)。你也可以在wiki python上找到更多使用內(nèi)置函數(shù)的場景。

    比如,現(xiàn)在我們想合并列表中的所有單詞為一個句子,比較法自己編寫和調(diào)用庫函數(shù)的區(qū)別:

    #???正常人能想到的方法
    @timeshow
    def?f1(list):
    ????s?=""
    ????for?substring?in?list:
    ????????s?+=?substring
    ????return?s
    #???pythonic?的方法
    @timeshow
    def?f2(list):
    ????s?=?"".join(list)
    ????return?s
    l?=?["I",?"Love",?"Python"]?*?1000?#?為了看到差異,我們把這個列表放大了
    f1(l)
    f2(l)

    運行輸出:

    f1 : 0.000227 secf2 : 0.000031 sec

    3. 少用循環(huán)

    用 列表推導式 代替循環(huán)

    用 迭代器 代替循環(huán)

    用 filter() 代替循環(huán)

    減少循環(huán)次數(shù),精確控制,不浪費CPU

    ##?返回n以內(nèi)的可以被7整除的所有數(shù)字。
    #???正常人能想到的方法:
    @timeshow
    def?f_loop(n):?
    ????L=[]
    ????for?i?in?range(n):
    ????????if?i?%?7?==0:
    ????????????L.append(i)
    ????return?L
    #????列表推導式
    @timeshow
    def?f_list(n):
    ????L?=?[i?for?i?in?range(n)?if?i?%?7?==?0]
    ????return?L
    #????迭代器
    @timeshow
    def?f_iter(n):
    ????L?=?(i?for?i?in?range(n)?if?i?%?7?==?0)
    ????return?L
    #???過濾器?
    @timeshow
    def?f_filter(n):
    ????L?=?filter(lambda?x:?x?%?7?==?0,?range(n))
    ????return?L
    #???精確控制循環(huán)次數(shù)?
    @timeshow
    def?f_mind(n):
    ????L?=?(i*7?for?i?in?range(n//7))
    ????return?L
    n?=?1_000_000
    f_loop(n)
    f_list(n)
    f_iter(n)
    f_filter(n)
    f_mind(n)

    輸出為:

    f_loop : 0.083017 secf_list : 0.056110 secf_iter : 0.000015 secf_filter : 0.000003 secf_mind : 0.000002 sec

    誰快誰慢,一眼便知!

    filter 配合lambda大法就是屌!!!

    4. 避免循環(huán)重復計算

    如果你有一個迭代器,必須用它的元素做一些耗時計算,比如匹配正則表達式。你應該將正則表達式模式定義在循環(huán)之外,因為最好只編譯一次模式,而不是在循環(huán)的每次迭代中一次又一次地編譯它。

    只要有可能,就應該嘗試在循環(huán)外進行盡可能多的運算,比如將函數(shù)計算分配給局部變量,然后在函數(shù)中使用它。

    #???應改避免的方式:
    @timeshow
    def?f_more(s):
    ????import?re
    ????for?i?in?s:
    ????????m?=?re.search(r'a*[a-z]?c',?i)
    #???更好的方式:
    @timeshow
    def?f_less(s):
    ????import?re
    ????regex?=?re.compile(r'a*[a-z]?c')
    ????for?i?in?s:
    ????????m?=?regex.search(i)
    s?=?["abctestabc"]?*?1_000
    f_more(s)
    f_less(s)

    輸出為:

    f_more : 0.001068 secf_less : 0.000365 sec

    5. 少用內(nèi)存、少用全局變量

    內(nèi)存占用是指程序運行時使用的內(nèi)存量。為了讓Python代碼運行得更快,應該減少程序的內(nèi)存使用量,即盡量減少變量或?qū)ο蟮臄?shù)量。

    Python 訪問局部變量比全局變量更有效。在有必要之前,應該始終嘗試忽略聲明全局變量。一個在程序中定義過的全局變量會一直存在,直到整個程序編譯完成,所以它一直占據(jù)著內(nèi)存空間。另一方面,局部變量訪問更快,且函數(shù)完成后即可回收。因此,使用多個局部變量比使用全局變量會更好。

    #???應該避免的方式:
    message?=?"Line1\n"
    message?+=?"Line2\n"
    message?+=?"Line3\n"
    #???更好的方式:
    l?=?["Line1","Line2","Line3"]
    message?=?'\n'.join(l)
    #???應該避免的方式:
    x?=?5
    y?=?6?
    def?add():
    ????return?x+y
    add()
    #???更好的方式:
    def?add():
    ????x?=?5
    ????y?=?6
    ????return?x+y
    add()

    總結(jié)

    本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注好二三四的更多內(nèi)容!

    文檔

    提升Python運行速度的5個小技巧

    雖然Python代碼運行緩慢,但可以通過下面分享的5個小技巧提升Python運行速度!1. 選擇合適的數(shù)據(jù)結(jié)構(gòu)。2. 善用強大的內(nèi)置函數(shù)和第三方庫。3. 少用循環(huán)。4. 避免循環(huán)重復計算。5. 少用內(nèi)存、少用全局變量。
    推薦度:
    為你推薦
    資訊專欄
    熱門視頻
    相關(guān)推薦
    Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現(xiàn)SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 描寫春天花朵的詩句 關(guān)于思念的詩句 帶馬字的詩句 牡丹花的詩句 想念的詩句 含雁的詩句 愁的詩句 珍惜時間的名言 清明節(jié)的諺語 關(guān)于清明的諺語 清明的諺語 冒泡排序算法 選擇排序算法 插入排序算法 希爾排序算法 歸并排序算法 學習python的while循環(huán)嵌套 分享15個超級好用得Python實用技巧 Python實現(xiàn)消消樂小游戲 python實現(xiàn)新年倒計時實例代碼 詳解python的循環(huán) 基于Python實現(xiàn)PDF區(qū)域文本提取工具 Python數(shù)據(jù)分析處理(三)--運動員信息的分組與聚合 Python實現(xiàn)城市公交網(wǎng)絡分析與可視化 Python&nbsp;垃圾回收機制詳解 關(guān)于樹的詩句 緬懷親人的詩句 春暖花開的詩句 家國情懷的詩句 含有星字的詩句 用來贊美老師的詩句 看破紅塵的經(jīng)典詩句 長江的詩句 關(guān)于傳統(tǒng)節(jié)日的詩句 三月桃花的詩句 夕陽的詩句
    Top 亚洲精品中文字幕无乱码| 日韩精品无码一区二区三区AV| 午夜精品视频在线| 一区二区国产精品| 2022国产精品福利在线观看| 中国精品18videosex性中国| 午夜精品在线视频| 91在线精品中文字幕| 中文字幕日韩精品无码内射| 国产精品午夜福利在线观看地址| 亚洲av产在线精品亚洲第一站| 中文字幕精品视频在线观| 国产精品入口麻豆电影网| 国产成人精品日本亚洲专区6| 久久久久久国产精品mv| 久久e热在这里只有国产中文精品99 | 免费国产精品视频| 3atv国产精品视频| 久久66热人妻偷产精品9| 中文字幕无码久久精品青草| 精品人妻一区二区三区四区在线| 中文字幕久久久久久精品| 2021国产精品自在拍在线播放| 青青草国产精品久久| 久久五月精品中文字幕| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 精品一区二区三区在线观看| 在线91精品亚洲网站精品成人| 51视频国产精品一区二区| 精品无码一区二区三区爱欲九九| 亚洲国产成人精品无码区在线观看| 国产精品无码无卡无需播放器| 情侣视频精品免费的国产| 亚洲国产精品无码第一区二区三区| 久久99精品久久久久久动态图 | 中文字幕久久精品无码| 亚洲精品国产日韩无码AV永久免费网| 国产精品伦子一区二区三区 | 老司机精品视频免费| 国产91精品久久久久999| 国产日韩精品一区二区在线观看播放|