當前位置:
首頁 > 科技 > 編寫高質量Python代碼的5個優化技巧

編寫高質量Python代碼的5個優化技巧

關鍵時刻,第一時間送達!

作者丨Michael Washburn Jr.

譯者丨安翔

如今我使用 Python 已經很長時間了,但當我回顧之前寫的一些代碼時,有時候會感到很沮喪。例如,最早使用 Python 時,我寫了一個名為 Sudoku 的遊戲(GitHub地址:https://github.com/MichaelWashburnJr/PythonSudoku)。這個遊戲在當時算是我比較拿得出手的項目了。然而現在,我無法直接複製其代碼並運行它,具體原因是我當時編碼時沒有添加一個setup.py 或者 requires.txt 文件,當然,這種錯誤我肯定不會再犯!

由此,我總結了多年來自己所編寫的 Python 代碼的質量變化過程。它們變得更加簡潔、健壯、易讀。但是什麼原因使得 Python 代碼變得更好呢?

在本文中筆者將與大家共同探討一些 Python 代碼的優化手段,或大或小。希望以此幫助你提高 Python 代碼的質量。當然,這些方式也可以適用於其他編程語言和技術。

1. 將代碼設置為可通過 PIP 安裝的軟體包

當你想要使用一個新的 Python 包時,如果可以使用 「pip install」命令跟上包名或者包的位置來安裝的話,就會非常方便。

有很多方法可以實現這一點,我的「go to」項目實現方法是創建一個 setup.py 文件。

假設我們在「flask_example.py」中有一個簡單的 Flask 程序:

from flask import Flask

app = Flask(__name__)

@app.route( / )

def hello_world():

return Hello, World!

def main():

app.run()

if __name__ == 『__main__』:

main()

我們可以將其設置為一個可安裝的 Python 包。方法是:首先把它移動到一個單獨的文件夾中(我們稱之為「flask_example /」),然後在項目根文件夾中創建一個如下所示的setup.py 文件:

from distutils.core import setup

setup(

name= flask_example ,

version= 1.0 ,

description= Hello, World! in flask. ,

packages=[ flask_example ],

install_requires=[

Flask==0.12.2

],

entry_points = {

console_scripts : runserver=flask_example.flask_example:main

}

)

這樣做可以帶來一系列優點。 首先,你可以使用「pip install -e」在本地安裝你的應用程序。這樣,開發人員可以輕鬆克隆和安裝項目,因為 setup.py 文件將會處理掉所有繁重的工作。

其次,使用 setup.py 文件來進行依賴關係管理。install_requires 變數能夠定義要使用的軟體包以及版本。如果你不確定使用的軟體包名稱和版本,可以運行「pip freeze」來查看它們。

最後,它可以為你的程序包定義入口點,通過簡單運行「runserver」即可在命令行中執行代碼。

2. 藉助 linter 工具捕獲代碼錯誤

使用 linter(語法檢查)可以自動修復代碼的語法問題。PyLint 是一款強大的 Python 版本的 linter 工具,如果你使用類似 Git 這樣的版本控制系統,可以在提交代碼之前讓 Git 通過一個 linter 運行代碼來解決語法問題。

首先需要安裝 PyLint 軟體包:

pip install pylint

然後,將以下代碼添加到.git/hooks/pre-commit。如果你已經有一個 pre-commit hook,那麼只需將 pylint 命令附加到文件的末尾即可。

#!/bin/sh

pylint

這樣做之後就可以在代碼提交到 Git 存儲庫之前自動捕獲各種錯誤。除了語法錯誤之外,它還能捕捉一些其他的 linter 工具能夠捕捉到的常見錯誤。

3. 盡量使用絕對路徑導入而不是相對路徑

在 Python 中,使用相對路徑導入模塊的情況很少(例如 from . import )。如果你已經為 Python 項目創建一個 setup.py(或者使用其他類似的機制)文件,那麼你可以簡單地通過模塊的完整路徑引用其子模塊。

PEP-8(Python風格指南) 推崇絕對路徑導入。這樣的話包名更加直觀,根據 Python 軟體基金會的說法就是「更規範」。

使用相對路徑的做法很快就會變成一場噩夢。早期的時候可能沒有問題,但是一旦你改名了模塊路徑或者進行重大的重構之後,它真的會讓你很頭痛。

4. 上下文管理(with 關鍵字)

無論何時打開文件、流或者連接,你通常都會使用上下文管理器。上下文管理器很有用,它能夠處理文件的關閉並拋出異常。Python 中使用 with 關鍵字可以很好的實現該功能。

大多數 Python 初學者可能會使用如下方式寫入文件:

f = open(『newfile.txt』, 『w』)

f.write(『Hello, World!』)

f.close()

這樣做很簡單,但是想像一下這種情況:假設你在文件中寫入了數千行,不幸的是突然拋出異常,你的文件並未正確關閉,此時你已經寫入文件的所有數據都會損壞或者丟失。

不用擔心,通過一些簡單的重構,即使遇到異常我們也可以確保文件正常關閉。我們可以這樣做:

with open(『file』, 『w』) as file:

file.write(『Hello, World!』)

非常簡單!並且代碼變得更加簡潔。你還可以使用單個「with」語句打開多個上下文管理器,而無需嵌套多個「with」語句。

with open(『file1』, 『w』) as f1, open(『file2』, 『w』) as f2:

f1.write(『Hello』)

f2.write(『World』)

5. 使用直觀、貼切的函數和變數名

在 Python 中,很容易對函數和返回值產生疑惑。特別是當你調用某些庫里的函數時。如果你能夠避免開發者通過查詢文檔才能得知函數功能,這樣的時間節省將是一個非常有價值的改進。如何做到呢?如何改變一些簡單的變數名稱來節省開發時間呢?

在命名函數或變數名時,我會著重考慮3點:

函數或變數的功能

與函數或變數相關聯的單位

函數或變數計算的數據類型

例如,如果我想創建一個函數來計算一個矩形的面積,我將函數命名為「calc_rect_area」。但這並沒有給用戶提供足夠的信息。函數會返回值嗎?還是將值存儲在其他某個地方?返回值的單位是英尺還是米呢?

為了使函數名提供更多信息,我將其修改為「get_rect_area_sq_ft」。這使得用戶清楚地知道該函數獲取並返回面積,並且單位是英尺。

如果你使用一些更加友好的函數和變數名為開發人員節省5分鐘,這些時間累積起來將大大提升開發者的效率。

總結

這些方法是我多年使用 Python 編程所積累的經驗。有些是我自己的總結,有些來自他人的指點。我希望上述建議能夠助你寫出更好的 Python 代碼。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

微博遭鹿晗戀情暴擊癱瘓,如何快速提高系統性能?
TIOBE 10 月編程語言排行榜:Swift 正過時?
創建一個分散式網路爬蟲的故事
GitHub的12 個實用技巧,你 get 了幾個?
基於REST微服務的5個最佳實踐

TAG:CSDN |