“人生苦短,我用Python”,說的就是Python開發“快”的優勢,相同的代碼量能夠完成其他語言數倍代碼量的任務。一般情況下,像C++、C、JAVA 、GO這類編譯型語言要比PHP、Python、JavaScript這類解釋性語言要快一些,但是各有各的優勢。
Python以其開發方便、語言生態健全,乘著人工智能之風很快成為了一門明星語言。使用Python提升開發效率的同時,代碼的運行效率卻沒那麼高。下面將介紹幾種簡單的方法,嘗試提升代碼的可讀性、執行效率。
一、優化編程慣例
1)用生成式生成列表:
假設我們正在編寫爬蟲,現在需要將解析到的信息生成列表。
不優雅的方法:
得到:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
用生成式更加優雅的完成:
輸出:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]
2)使用enumerate進行迭代:
enumerate方法用於將一個可遍歷的數據對象組合為一個索引序列,同時輸出數據和數據下標,一般用於for循環之中,演示如下:
不優雅的方法:
輸出:
優雅的方法,使用enumerate函數:
3)用join方法生成字符串:
join()函數能夠將序列中的元素按照給定的字符鏈接生成一個新的字符串。
不好的代碼:
輸出:我-在-知-了-課-堂-學-Python-
使用join方法:
輸出:我-在-知-了-課-堂-學-Python
4)不適用臨時變量交換兩個值:
5)使用:
二、使用Cython模塊提升代碼執行速度
Python有著良好的擴展性與接口功能,人工智能大多數庫都是C++或者C寫來由Python調用。大公司會使用Python來提升開發效率,用C來彌補性能缺口。在Python官方文檔中,也給出了Python的C API接口的文檔,但是下面也標註了“給 C/C++ 程序員的參考手冊”,絕非等閒之輩能輕易掌握!好消息是,有Cython模塊,官方是這樣介紹的(翻譯):
[Cython]是一種編程語言,它使編寫Python語言的C擴展與Python本身一樣容易。它旨在成為[Python]語言的超集,從而為它提供高級,面向對象,功能和動態編程。
Cython是Python編譯器。這意味著它可以編譯普通的Python代碼而無需進行更改(除了一些尚不支持的語言功能的明顯例外),接下來使用Cython提升Python執行速度。
1)安裝:
使用cython最簡單的方法是執行
也可以從https://cython.org/下載最新版本 。解壓縮tarball或zip文件,輸入目錄,然後運行:
另外需要安裝gcc,linux下一般自帶。
2)Hello, Cython:
使用官方推薦的方法(使用setuptools)構建我們的代碼,
創建hello.pyx文件(你沒看錯,不是.py而是.pyx)並鍵入:
創建對應的setup.py腳本:
cmd到當前目錄,執行:
gcc與g++都安裝但是,報錯,缺乏 Microsoft visual C++ 14.0,遂下載安裝:
4GB!太大了,用linux試試!
在centos環境下,重複上述步驟:
成功,並且生成了一個hello.cpython-36m-x86_64-linux-gnu.so文件, 在Windows下會生成.pyd文件。
使用:
hon VS Python :
斐波那契數列,通俗易懂,使用Python容易實現,也考驗計算能力。我們分別用Python和cython來計算斐波那契第38項的值,同一臺機器,看誰算的快!
使用Python:
創建fib1.py並鍵入:
成績:11.73秒
使用Cython:
創建一個fib2.pyx並鍵入:
創建相應的setup.py:
執行:
建立測試文件test.py:
成績,2.20秒
awesome!快了5倍多,實際上隨著項的增大,成績還會有所提升。
使用cython不僅能夠大幅提升代碼的運行速度,還能夠起到加密核心代碼的作用,即便是被對手入侵了服務器,也不必擔心核心代碼洩露。
三、使用科學計算庫
知名的科學計算庫如numpy、pandas等底層都使用C++、C完成,這在一定程度上保證了執行速度,另一方面也能幫助我們提升可讀性。
我們分別用numpy和傳統的**方法來計算一個數組的乘方,
很給力,快了數倍:
相信,不斷的優化我們的編程習慣,像寫詩一樣寫代碼,養成良好科學的計算習慣,一定能夠寫出pythonic代碼!