Python 是當今使用最多的流行編程語言之一,由於:它是開源的,它有普遍的用途(例如 Web 編程、業務應用、遊戲、科學編程等等),它有一個充滿活力和專一的社區支持它。這個社區可讓咱們在 Python Package Index(PyPI)中有如此龐大、多樣化的軟件包,用以擴展和改進 Python 並解決不可避免的問題。算法
在本系列中,咱們將介紹七個能夠幫助你解決常見 Python 問題的 PyPI 庫。首先是 Cython,一個簡化 Python 編寫 C 擴展的語言。編程
Cython編程語言
使用 Python 頗有趣,但有時,用它編寫的程序可能很慢。全部的運行時動態調度會帶來很大的代價:有時它比用 C 或 Rust 等系統語言編寫的等效代碼慢 10 倍。函數
將代碼遷移到一種全新的語言可能會在成本和可靠性方面付出巨大代價:全部的手工重寫工做都將不可避免地引入錯誤。咱們能夠二者兼得麼?優化
爲了練習一下優化,咱們須要一些慢代碼。有什麼比斐波那契數列的意外指數實現更慢?遊戲
def fib(n): if n < 2: return 1 return fib(n-1) + fib(n-2)
因爲對 fib 的調用會致使兩次再次調用,所以這種效率極低的算法須要很長時間才能執行。例如,在個人新筆記本電腦上,fib(36) 須要大約 4.5 秒。這個 4.5 秒會成爲咱們探索 Python 的 Cython 擴展能提供的幫助的基準。社區
使用 Cython 的正確方法是將其集成到 setup.py 中。然而,使用 pyximport 能夠快速地進行嘗試。讓咱們將 fib 代碼放在 fib.pyx 中並使用 Cython 運行它。效率
>>> import pyximport; pyximport.install() >>> import fib >>> fib.fib(36)
只使用 Cython 而不修改代碼,這個算法在我筆記本上花費的時間減小到大約 2.5 秒。幾乎無需任何努力,這幾乎減小了 50% 的運行時間。固然,獲得了一個不錯的成果。import
加把勁,咱們可讓它變得更快。擴展
cpdef int fib(int n): if n < 2: return 1 return fib(n - 1) + fib(n - 2)
咱們將 fib 中的代碼變成用 cpdef 定義的函數,並添加了兩個類型註釋:它接受一個整數並返回一個整數。
這個變得快多了,大約只用了 0.05 秒。它是如此之快,以致於我可能開始懷疑個人測量方法包含噪聲:以前,這種噪聲在信號中丟失了。
當下次你的 Python 代碼花費太多 CPU 時間時,也許會致使風扇狂轉,爲什麼不看看 Cython 是否能夠解決問題呢?
在本系列的下一篇文章中,咱們將看一下 Black,一個自動糾正代碼格式錯誤的項目。