<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>
  • 更多精彩內容,歡迎關注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

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

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

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

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

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

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

    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. 選擇合適的數據結構

    使用正確的數據結構對python腳本的運行時間有顯著影響。Python 有四種內置的數據結構:

    列表: List

    元組: Tuple

    集合: Set

    字典: Dictionary

    但是,大多數開發人員在所有情況下都使用列表。這是不正確的做法,應該根據任務使用合適數據結構。

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

    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. 善用強大的內置函數和第三方庫

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

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

    比如,現在我們想合并列表中的所有單詞為一個句子,比較法自己編寫和調用庫函數的區別:

    #???正常人能想到的方法
    @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. 少用循環

    用 列表推導式 代替循環

    用 迭代器 代替循環

    用 filter() 代替循環

    減少循環次數,精確控制,不浪費CPU

    ##?返回n以內的可以被7整除的所有數字。
    #???正常人能想到的方法:
    @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
    #???精確控制循環次數?
    @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. 避免循環重復計算

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

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

    #???應改避免的方式:
    @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. 少用內存、少用全局變量

    內存占用是指程序運行時使用的內存量。為了讓Python代碼運行得更快,應該減少程序的內存使用量,即盡量減少變量或對象的數量。

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

    #???應該避免的方式:
    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()

    總結

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

    為你推薦
    資訊專欄
    熱門視頻
    相關推薦
    Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 信息系統項目管理師報考條件 信息系統項目管理師報考時間 信息系統項目管理師報名時間 信息系統項目管理師考試時間 pmp與信息系統項目管理師 信息系統項目管理師報考要求 信息系統項目管理師有效期 信息系統項目管理師考什么論文 信息系統項目管理師是什么類別 軟考信息系統項目管理師怎么備考 備考流程有哪些 考信息系統項目管理師需要考幾門 信息系統項目管理師考試幾門 信息系統項目管理師初中能考嗎 信息系統項目管理師英語簡稱 滲透測試怎么做 滲透測試的步驟都有哪些 你知道嗎 滲透測試需要學什么 學習python的while循環嵌套 Python實現消消樂小游戲 python實現新年倒計時實例代碼 詳解python的循環 基于Python實現PDF區域文本提取工具 Python數據分析處理(三)--運動員信息的分組與聚合 Python實現城市公交網絡分析與可視化 Python&nbsp;垃圾回收機制詳解 python正則表達式語法學習筆記 一文秒懂python正則表達式常用函數 Python常用的正則表達式處理函數詳解 JS截取字符串的三種方法詳解 PHP遍歷數組的6種方式總結 php兩種基本的輸出方及實例詳解 php生成唯一uid的解決方法詳解 PHP7中對十六進制字符串處理的問題詳解 PHP對接抖音開發平臺接口的詳細教程 php7安裝mysqli實例講解 php去掉一維數組的鍵值的實例方法 PHP中empty()和isset()的區別介紹
    Top 日韩精品无码熟人妻视频| 亚洲国产精品成人久久蜜臀| 国产午夜精品久久久久免费视| 亚洲精品又粗又大又爽A片| 久久精品国产999大香线焦| jizz国产精品网站| 国产精品日韩一区二区三区| 亚洲精品国产福利片| 国产精品igao视频网| 国产美女精品视频| 国产成人综合久久精品免费| 亚洲区日韩精品中文字幕| 亚洲精品中文字幕无乱码| 久久er热视频在这里精品| 精品福利一区二区三区| 国产成人精品免费直播| 精品无码国产AV一区二区三区| 国产第一福利精品导航| 91久久精品国产91久久性色tv| 国产成人精品优优av| 亚洲人精品午夜射精日韩| 国产精品尹人在线观看| 成人国产精品999视频| 最新69国产成人精品免费视频动漫 | 亚洲精品无码久久久久sm| www国产亚洲精品久久久日本| 日韩精品视频免费网址| 日本精品αv中文字幕| 精品哟哟哟国产在线不卡| 精品一区二区三区| 久久精品国产亚洲AV天海翼| 亚洲中文字幕久久精品蜜桃| 亚洲国产精品嫩草影院| 亚洲日韩一区精品射精| 亚洲AV成人精品一区二区三区| 国产香蕉久久精品综合网| 久久精品国内一区二区三区| 久久精品国产亚洲AV| 日韩精品一区二区三区国语自制 | 国内大量偷窥精品视频| 中文字幕九七精品乱码|