WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

“人生苦短,我用Python”,說的就是Python開發“快”的優勢,相同的代碼量能夠完成其他語言數倍代碼量的任務。一般情況下,像C++、C、JAVA 、GO這類編譯型語言要比PHP、Python、JavaScript這類解釋性語言要快一些,但是各有各的優勢。

Python以其開發方便、語言生態健全,乘著人工智能之風很快成為了一門明星語言。使用Python提升開發效率的同時,代碼的運行效率卻沒那麼高。下面將介紹幾種簡單的方法,嘗試提升代碼的可讀性、執行效率。

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

一、優化編程慣例

1)用生成式生成列表:

假設我們正在編寫爬蟲,現在需要將解析到的信息生成列表。

不優雅的方法:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

得到:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]

用生成式更加優雅的完成:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

輸出:[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’]

2)使用enumerate進行迭代:

enumerate方法用於將一個可遍歷的數據對象組合為一個索引序列,同時輸出數據和數據下標,一般用於for循環之中,演示如下:

不優雅的方法:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

輸出:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

優雅的方法,使用enumerate函數:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

3)用join方法生成字符串:

join()函數能夠將序列中的元素按照給定的字符鏈接生成一個新的字符串。

不好的代碼:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

輸出:我-在-知-了-課-堂-學-Python-

使用join方法:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

輸出:我-在-知-了-課-堂-學-Python

4)不適用臨時變量交換兩個值:
WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

5)使用:
WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

二、使用Cython模塊提升代碼執行速度

Python有著良好的擴展性與接口功能,人工智能大多數庫都是C++或者C寫來由Python調用。大公司會使用Python來提升開發效率,用C來彌補性能缺口。在Python官方文檔中,也給出了Python的C API接口的文檔,但是下面也標註了“給 C/C++ 程序員的參考手冊”,絕非等閒之輩能輕易掌握!好消息是,有Cython模塊,官方是這樣介紹的(翻譯):

[Cython]是一種編程語言,它使編寫Python語言的C擴展與Python本身一樣容易。它旨在成為[Python]語言的超集,從而為它提供高級,面向對象,功能和動態編程。

Cython是Python編譯器。這意味著它可以編譯普通的Python代碼而無需進行更改(除了一些尚不支持的語言功能的明顯例外),接下來使用Cython提升Python執行速度。

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

1)安裝:

使用cython最簡單的方法是執行

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

也可以從https://cython.org/下載最新版本 。解壓縮tarball或zip文件,輸入目錄,然後運行:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

另外需要安裝gcc,linux下一般自帶。

2)Hello, Cython:

使用官方推薦的方法(使用setuptools)構建我們的代碼,

創建hello.pyx文件(你沒看錯,不是.py而是.pyx)並鍵入:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

創建對應的setup.py腳本:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

cmd到當前目錄,執行:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

gcc與g++都安裝但是,報錯,缺乏 Microsoft visual C++ 14.0,遂下載安裝:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

4GB!太大了,用linux試試!

在centos環境下,重複上述步驟:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

成功,並且生成了一個hello.cpython-36m-x86_64-linux-gnu.so文件, 在Windows下會生成.pyd文件。

使用:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

hon VS Python :

斐波那契數列,通俗易懂,使用Python容易實現,也考驗計算能力。我們分別用Python和cython來計算斐波那契第38項的值,同一臺機器,看誰算的快!

使用Python:

創建fib1.py並鍵入:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

成績:11.73秒

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

使用Cython:

創建一個fib2.pyx並鍵入:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

創建相應的setup.py:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

執行:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

建立測試文件test.py:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

成績,2.20秒

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

awesome!快了5倍多,實際上隨著項的增大,成績還會有所提升。

使用cython不僅能夠大幅提升代碼的運行速度,還能夠起到加密核心代碼的作用,即便是被對手入侵了服務器,也不必擔心核心代碼洩露。

三、使用科學計算庫

知名的科學計算庫如numpy、pandas等底層都使用C++、C完成,這在一定程度上保證了執行速度,另一方面也能幫助我們提升可讀性。

我們分別用numpy和傳統的**方法來計算一個數組的乘方,

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

很給力,快了數倍:

WTF?能把Python代碼寫得這麼優雅的都是神仙程序員吧!

相信,不斷的優化我們的編程習慣,像寫詩一樣寫代碼,養成良好科學的計算習慣,一定能夠寫出pythonic代碼!


分享到:


相關文章: