只會在終端使用Python運行代碼?這些進階用法了解了解
大部分同學(xué)在終端使用Python可能只是簡單的執(zhí)行代碼,但其實結(jié)合一些Python內(nèi)置模塊或第三方庫可以實現(xiàn)更高級且便捷的用法,一起看看吧!
代碼Benchmark測試
首先簡單寫個斐波那契數(shù)列,命名為example.py:
import time
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
def main(test_times=50):
start = time.perf_counter()
for _ in range(test_times):
fib(30)
print(f'Time spent: {time.perf_counter() - start} s')
if __name__ == '__main__':
main()
現(xiàn)在對這份代碼進行Benchmark測試,Python中的內(nèi)置模塊cProfile可以幫助我們完成這個工作,在終端執(zhí)行以下命令:
python -m cProfile example.py
可以得到一份深入的測試報告,如圖所示:
其中表頭從左至右:
- ncalls:函數(shù)被調(diào)用的次數(shù)
- tottime:函數(shù)花費的總時間(不包括被調(diào)用函數(shù)花費的時間)
- percall:每次調(diào)用所花費的時間(等于tottime除以ncalls)即15.358/134626850
- cumtime:在函數(shù)中累計花費的時間,包括在被調(diào)用函數(shù)中花費的時間
- percall:每次調(diào)用所花費的時間(等于cumtime除以ncalls)15.358/50
是不是肥腸簡單且清晰明了,對我們優(yōu)化代碼提供幫助。
值得一提的是,如果只想測試一些簡單的Python代碼,內(nèi)置的timeit是個不錯的選擇,如:
python -m timeit '[i for i in range(100)]'
使用 timeit 測量執(zhí)行此列表推導(dǎo)式所需的時間,得到輸出:
200000 loops, best of 5: 1.4 usec per loop
此輸出表明每次計時將執(zhí)行200000次列表推導(dǎo),共計時測試了5次,最好的結(jié)果是1.4毫秒。
代碼風(fēng)格檢查
如何評估我們的Python代碼是否Pythonic呢?第三方庫flake8可以輕松做到,首先安裝:
pip install flake8
確保安裝完成后,我們還是使用前述斐波那契example.py,只需在終端輸入:
python -m flake8 example.py
輸出:
可以按照提示進行優(yōu)化。
格式化Python代碼
當(dāng)知道我們寫的史山代碼需要風(fēng)格改進,由前述可以結(jié)合flake8進行手動優(yōu)化,那有沒有什么能幫我們自動優(yōu)化呢?第三方庫black誕生。
同樣使用pip安裝:
pip install black
安裝完畢后通過一行命令使用black格式化我們的代碼:
python -m black example.py
輸出:
然后再次使用flake8檢查代碼風(fēng)格,無任何輸出,代表無優(yōu)化項。
此時我們的代碼變成了:
import time
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
def main(test_times=50):
start = time.perf_counter()
for _ in range(test_times):
fib(30)
print(f"Time spent: {time.perf_counter() - start} s")
if __name__ == "__main__":
main()
使用Pylint進行更專業(yè)的代碼分析
僅擁有良好的風(fēng)格還不完美,為了進行樣式之外的代碼分析,還需要結(jié)合pylint:
pip install pylint
此處基于black優(yōu)化過的代碼進行pylint分析,在終端輸入一行命令:
python -m pylint example.py
輸出如下,可知該代碼缺少文檔字符串
所以在大佬review代碼前,可以借助pylint先進行一波優(yōu)化。
對代碼進行安全性分析
Python第三方庫bandit可以幫助我們檢查代碼中潛在的安全隱患、不安全的函數(shù)或模塊、密碼或密鑰等問題:
pip install bandit
在終端執(zhí)行如下命令進行安全檢查:
python -m bandit example.py
輸出:
表明肥腸安全。
解析json并清晰打印
除了在vscode中打開json,并格式化顯示達到清晰展示的目的外,Python自帶的模塊也能完成這個,比如有example.json文件內(nèi)容如下:
[
{"name": {"first_name":"Xukong", "last_name":"Cai"}, "hobby":"rap, basketball"},
{"name": {"first_name":"San", "last_name":"Zhang"}, "hobby":"eat"}
]
使用如下命令在終端格式化顯示:
python -m json.tool example.json
輸出:
肥腸清晰,插一句,若同樣想在終端打印代碼中輸出的json結(jié)構(gòu),可以使用pprint。