摘要:假設我們需要在程序中計算一些數字的平方根。此外如果我們需要在程序中多次使用平方根函數,代碼將會更整潔。然而在這個虛構的例子中,只有的年齡超過歲。然后檢查這三個人的年齡是否滿足第二個條件。
作者:?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】至聯系郵箱,申請白名單授權并按要求編輯。
發布后請將鏈接反饋至聯系郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。
點擊“閱讀原文”擁抱組織
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121153.html
摘要:沒有創建計算列導致查詢不優化。配置虛擬內存虛擬內存大小應基于計算機上并發運行的服務進行配置。運行時,可考慮將虛擬內存大小設置為計算機中安裝的物理內存的倍。用查詢優化器可見到差別。一、查詢速度慢的原因很多,我總結SQL查詢慢的10個原因: 1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程序設計的缺陷) 2、I/O吞吐量小,形成了瓶頸效應?! ?、沒有創建計算列導致查詢不優化?! ?..
摘要:文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。命名規則原則盡量避免潛在命名沖突,避免過于精簡,應見名知意。必須與共同使用的構造函數名應以大寫字母開頭。變量所有的變量必須在使用前進行聲明。僅在函數和構造器內使,以明確的上下指向。 代碼格式規范 1.html中外部腳本引入盡量放在尾部。 2.一個html文件中只寫一個代碼塊。 3.JS文件中的代碼塊可用以下代碼塊包裹,以減少全局污染。 ...
閱讀 737·2021-11-11 16:54
閱讀 3053·2021-09-26 09:55
閱讀 2002·2021-09-07 10:20
閱讀 1198·2019-08-30 10:58
閱讀 1039·2019-08-28 18:04
閱讀 697·2019-08-26 13:57
閱讀 3581·2019-08-26 13:45
閱讀 1150·2019-08-26 11:42