選單

6種方法讓你的Python程式變更慢

作者:Christopher Tao

翻譯:王可汗

轉自:資料派THU(ID:DatapiTHU)

大家好,歡迎來到 Crossin的程式設計教室 !

隨著Python的流行,使用者數量也在增加。Python確實相對容易上手,也非常靈活,因此有更多可能的方式來實現一個函式。

當有多種方法可以實現一件特定的事情時,這意味著每種方法都有優缺點。在本文中,我收集了6種編寫Python程式碼的典型方法,這些方法可能導致相對較差的效能。

一、不匯入根模組

在使用Python時,我們無法避免的一件事就是匯入模組,無論是內建模組還是第三方模組。有時我們可能只需要其中的一個或幾個函式或物件。在這種情況下,我們應該只匯入需要的函式或物件,而不是匯入根模組。

這裡有一個簡單的例子。假設我們需要在程式中計算一些數字的平方根。

低效率示範:

在這個錯誤的示例中,我們匯入了math模組,並使用math。sqrt()訪問該函式。當然它可以執行,但是如果我們直接匯入sqrt()函式,效能會更好。

高效率示範:

這比原來的快了25%。此外如果我們需要在程式中多次使用平方根函式,程式碼將會更整潔。

二、避免使用點/點連結

在Python中訪問物件的屬性或函式時,使用。是非常直觀的。這種方法大多數時候都沒有問題。然而如果我們能夠避免使用點或點連結,那麼效能便會變得更好。

低效率例子:

高效率例子:

6種方法讓你的Python程式變更慢

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

6種方法讓你的Python程式變更慢

注意:

我可以預料到許多Python開發人員會跳出來說,這個例子中的技術有點可笑。事實上即使是我自己,也很少像上面那樣寫程式碼。然而我們應該知道怎樣的程式碼是更高效的,可以使實現更快。

如果我們想要新增列表並從列表中移除專案,我們應該考慮使用這個技巧。這就是為什麼我們需要平衡程式碼的效能和可讀性。

三、不使用+連線字串

字串在Python中是不可變的。因此當我們使用“+”將多個字串連線成一個長字串時,每個子字串都是單獨操作的。

低效率例子:

具體來說,對於每個子字串,它需要請求一個記憶體地址,然後將它與該記憶體地址中的原始字串連線起來。這就產生了一種開銷。

高效率例子:

然而當我們使用join()函式時,該函式事先知道所有子字串,並根據最終的字串長度分配記憶體地址。因此省去了為每個子字串分配記憶體的開銷。

注意點:

強烈建議儘可能多地使用join()函式。然而,有時我們可能只想連線兩個字串。或者只是為了方便起見,我們想使用“+”。在這些情況下,使用“+”號可以獲得更好的可讀性和更短的程式碼長度。

四、不使用臨時變數進行值交換

許多演算法需要兩個變數的值交換。在大多數其他程式語言中,通常要引入一個臨時變數來實現,如下所示。

低效率示範:

6種方法讓你的Python程式變更慢

很明顯我們需要一個臨時變數作為過渡。當變數b的值被傳遞給變數a時,它用於儲存變數a的值,然後a的值可以被賦給變數b。

高效率示範:

然而在Python中,我們不需要使用臨時變數。Python有如下內建語法來實現這個值交換。這不僅提升了效率,而且使程式碼更加整潔。

五、在if條件下使用短路邏輯(short-circuit)

短路計算在許多程式語言中都存在,Python也是如此。它指的是一些布林運算子的計算邏輯,只有在第一個引數不足以確定整個表示式的值時,才執行或計算第二個引數。讓我們用一個例子來演示。假設我們有如下列表。

我們的工作是篩選名單,找出姓名以“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程式更快的技巧。但是我們也需要特別注意的是,我們不應該總是把效能放在第一位。有時可讀性和簡潔性也應該考慮在內,這一切最重要的是平衡。