作者: Christopher Tao
翻譯:王可汗
校對:王雨桐
本文約1800字,建議閱讀5分鐘
本文總結了Python代碼中經常被忽略的影響代碼的運行速度常見問題,
隨著Python的流行,用戶數量也在增加,Python確實相對容易上手,也非常靈活,因此有更多可能的方式來實作一個函式,
當有多種方法可以實作一件特定的事情時,這意味著每種方法都有優缺點,在本文中,我收集了6種撰寫Python代碼的典型方法,這些方法可能導致相對較差的性能,
一、不匯入根模塊
在使用Python時,我們無法避免的一件事就是匯入模塊,無論是內置模塊還是第三方模塊,有時我們可能只需要其中的一個或幾個函式或物件,在這種情況下,我們應該只匯入需要的函式或物件,而不是匯入根模塊,
這里有一個簡單的例子,假設我們需要在程式中計算一些數字的平方根,
低效率示范:

在這個錯誤的示例中,我們匯入了math模塊,并使用math.sqrt()訪問該函式,當然它可以運行,但是如果我們直接匯入sqrt()函式,性能會更好,
高效率示范:

這比原來的快了25%,此外如果我們需要在程式中多次使用平方根函式,代碼將會更整潔,
二、避免使用點/點鏈接
在Python中訪問物件的屬性或函式時,使用.是非常直觀的,這種方法大多數時候都沒有問題,然而如果我們能夠避免使用點或點鏈接,那么性能便會變得更好,
低效率例子:

高效率例子:

如果你不相信它能起到同樣的作用,我們可以驗證一下,

注意:我可以預料到許多Python開發人員會跳出來說,這個例子中的技術有點可笑,事實上即使是我自己,也很少像上面那樣寫代碼,然而我們應該知道怎樣的代碼是更高效的,可以使實作更快,
如果我們想要添加串列并從串列中移除專案,我們應該考慮使用這個技巧,這就是為什么我們需要平衡代碼的性能和可讀性,
三、不使用+連接字串
字串在Python中是不可變的,因此當我們使用“+”將多個字串連接成一個長字串時,每個子字串都是單獨操作的,
低效率例子:

具體來說,對于每個子字串,它需要請求一個記憶體地址,然后將它與該記憶體地址中的原始字串連接起來,這就產生了一種開銷,
高效率例子:

然而當我們使用join()函式時,該函式事先知道所有子字串,并根據最終的字串長度分配記憶體地址,因此省去了為每個子字串分配記憶體的開銷,
注意點:強烈建議盡可能多地使用join()函式,然而,有時我們可能只想連接兩個字串,或者只是為了方便起見,我們想使用“+”,在這些情況下,使用“+”號可以獲得更好的可讀性和更短的代碼長度,
四、不使用臨時變數進行值交換
許多演算法需要兩個變數的值交換,在大多數其他編程語言中,通常要引入一個臨時變數來實作,如下所示,
低效率示范:

很明顯我們需要一個臨時變數作為過渡,當變數b的值被傳遞給變數a時,它用于保存變數a的值,然后a的值可以被賦給變數b,
高效率示范:
然而在Python中,我們不需要使用臨時變數,Python有如下內置語法來實作這個值交換,這不僅提升了效率,而且使代碼更加整潔,

五、在if條件下使用短路邏輯(short-circuit)
短路計算在許多編程語言中都存在,Python也是如此,它指的是一些布爾運算子的計算邏輯,只有在第一個引數不足以確定整個運算式的值時,才執行或計算第二個引數,讓我們用一個例子來演示,假設我們有如下串列,
my_dict = [
{
'name': 'Alice',
'age': 28
},
{
'name': 'Bob',
'age': 23
},
{
'name': 'Chris',
'age': 33
},
{
'name': 'Chelsea',
'age': 2
},
{
'name': 'Carol',
'age': 24
}
]
我們的作業是篩選名單,找出姓名以“C”開頭、年齡在30歲以上的所有人,
低效率示范:
有兩個條件都需要滿足:
名字以“C”開頭
年齡≥30歲
我們可以這樣寫代碼,

高效率示范:
前面示例中的代碼沒有任何錯誤,然而在這個虛構的例子中,只有“Chris”的年齡超過30歲,
因此如果我們先寫出檢查名字的條件,則滿足了3個名字(Chris, Chelsea, Carol),然后檢查這三個人的年齡是否滿足第二個條件,
但是由于短路邏輯,如果我們先寫年齡條件,只有Chris的年齡在30歲以上,我們會再次檢查他的名字是否以“C”開頭,

在這種情況下,它幾乎快了100%,
六、如果可以使用for回圈,就不要使用while回圈
Python使用大量C語言來提高性能,即CPython,在回圈陳述句方面,與while回圈相比,Python中的for回圈有相對較少的步驟,而更多的步驟是作為C代碼運行的,
因此當我們可以在Python中使用for回圈時,盡量避免使用while回圈,這不僅是因為在Python中for回圈更優雅,而且性能更好,
低效率示范:

高效率示范:

總結
在本文中,我列出了6個可以使Python程式更快的技巧,但是我們也需要特別注意的是,我們不應該總是把性能放在第一位,有時可讀性和簡潔性也應該考慮在內,這一切最重要的是平衡,
原文標題:
Six Bad Manners that Make YourPython Program Slower
原文鏈接:
https://towardsdatascience.com/6-bad-manners-makes-your-python-program-slower-15b6fce62927
編輯:黃繼彥
譯者簡介

王可汗,清華大學機械工程系直博生在讀,曾經有著物理專業的知識背景,研究生期間對資料科學產生濃厚興趣,對機器學習AI充滿好奇,期待著在科研道路上,人工智能與機械工程、計算物理碰撞出別樣的火花,希望結交朋友分享更多資料科學的故事,用資料科學的思維看待世界,
翻譯組招募資訊
作業內容:需要一顆細致的心,將選取好的外文文章翻譯成流暢的中文,如果你是資料科學/統計學/計算機類的留學生,或在海外從事相關作業,或對自己外語水平有信心的朋友歡迎加入翻譯小組,
你能得到:定期的翻譯培訓提高志愿者的翻譯水平,提高對于資料科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯系,THU資料派產學研的背景為志愿者帶來好的發展機遇,
其他福利:來自于名企的資料科學作業者,北大清華以及海外等名校學生他們都將成為你在翻譯小組的伙伴,
點擊文末“閱讀原文”加入資料派團隊~
轉載須知
如需轉載,請在開篇顯著位置注明作者和出處(轉自:資料派ID:DatapiTHU),并在文章結尾放置資料派醒目二維碼,有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】至聯系郵箱,申請白名單授權并按要求編輯,
發布后請將鏈接反饋至聯系郵箱(見下方),未經許可的轉載以及改編者,我們將依法追究其法律責任,

點擊“閱讀原文”擁抱組織
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/303054.html
標籤:python

