立竿見影地把你的 Python 程式碼提速7倍
之前曾經測試計算斐波那契數列的幾種方法,其中基於遞迴的方法是速度最慢的,例如計算第 40 項的值,需要 36 秒。如下圖所示。
要提高運算速度,根本辦法當然是改進演算法。不過演算法的提高是一個長期積累加上靈機一動的過程。我們今天要講的,是一個不費腦筋,立竿見影的方法——把 Python 程式碼編譯成 C 語言程式碼。透過 C 語言的執行效率來加速計算過程。
這個過程看起來很複雜,但實際上你並不需要編寫一行 C 語言程式碼。你需要做的只是使用一個叫做 Cython 的庫把 Python 程式碼編譯為 C 語言程式碼即可。
首先我們來安裝 Cython,就像安裝普通的第三方庫一樣:
python3 -m pip install cython
安裝完成以後,我們單獨寫計算斐波那契數列的函式:
def fib(n):
if n in [1, 2]:
return 1
return fib(n - 1) + fib(n - 2)
非常簡單的遞迴寫法。然後關鍵來了,我們要把這個檔案儲存為fast_fib.pyx
。注意字尾是.pyx
。如下圖所示:
然後我們建立一個setup.py
檔案,檔案內容如下:
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize('fast_fib.pyx'))
如下圖所示:
這個檔案的作用,就是呼叫 Cython 的cythonize
函式把 Python 程式碼轉換為 C 程式碼。
接下來,開始編譯程式碼,執行如下命令:
python3 setup.py build_ext --inplace
我的 Python 是 Python3.7,所以執行完成以後,會生成一個fast_fib.cpython-37m-darwin.so
,如果你的 Python 是3.8,這個檔名可能是fast_fib.cpython-38m-darwin.so
。這個檔案你可以改名字,例如改成fast_fib.so
。
還有一個檔案叫做fast_fib.c
。不過你不用開啟這個檔案,因為它有3200多行。並且你甚至可以直接把它刪掉。真正有用的只有這個fast_fib.cpython-38m-darwin.so
檔案。
你需要做的,僅僅是直接呼叫你的函式。我們另外建立一個檔案test_fast_fib.py
,內容如下:
import time
from fast_fib import fib
start = time.time()
result = fib(40)
end = time.time()
print(f'斐波拉契數列第40項為:{result},耗時:{end - start}秒')
執行效果如下圖所示:
計算斐波那契數列第40項只需要5秒鐘,速度妥妥變成 Python 版本的7倍。
使用 Cython,不僅可以提高程式的執行速度,還可以把你的核心程式碼轉換為.so
檔案,防止別人反編譯看到你的程式碼。
關於 Cython 的更多介紹,請閱讀它的官方文件[1]
有同學可能會問,當前資料夾下面既然有fast_fib.pyx
檔案,為什麼當我們執行from fast_fib import fib
的時候,不會從這個檔案裡面匯入 Python 版本的程式碼?
這是因為,import
只會從字尾為.py
/.pyc
/.pyo
/.so
的檔案中匯入模組,不會進入.pyx
檔案中尋找。
參考資料
官方文件:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557738/viewspace-2686668/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [iOS]一次立竿見影的首頁渲染時間優化iOS優化
- [貝聊科技]一次立竿見影的首頁渲染時間優化優化
- 資料視覺化報表分享||立竿見影的財務資料分析模板視覺化
- Res2Net:新的深度學習多尺度結構,提升物體檢測立竿見影深度學習
- 幽默:把Java寫成Python風格的程式碼JavaPython
- 你見過背誦程式碼的程式設計師嗎?程式設計師
- 你見過Python的GIL嗎Python
- setuptools把python程式釋出到pypi的攻略Python
- 用 PyPy 讓你的 Python 程式碼執行得更快!Python
- 你見過哪些優雅的 Java 程式碼最佳化技巧?Java
- prettier 把我程式碼弄的很醜
- Pylint:讓你的 Python 程式碼保持一致Python
- 有輕功:用3行程式碼讓Python資料處理指令碼獲得4倍提速行程Python指令碼
- 把你的程式放到桌面——Android桌面部件WidgetAndroid
- 為你的Python程式加密Python加密
- Python語言的全排列怎麼提速?Python
- 如何把 awk 指令碼移植到 Python指令碼Python
- 你一定要知道的敏捷規劃工具:影響地圖敏捷地圖
- 學習 27 門程式語言的長處,提升你的 Python 程式碼水平Python
- 帶你入門比Python更高效的Numpy(附程式碼)Python
- 6種為你的laravel應用提速的方式Laravel
- 向量化程式碼實踐與思考:如何藉助向量化技術給程式碼提速
- 你肯定想學習的頂級Python專案(附程式碼)Python
- 經過4次優化我把python程式碼耗時減少95%優化Python
- 把Mybatis Generator生成的程式碼加上想要的註釋MyBatis
- 七個不一樣的Python程式碼寫法,讓你寫出一手漂亮的程式碼Python
- 拯救你的Go程式碼Go
- 如何把程式碼中的註釋批次刪除
- 給你的專案啟動提提速:Lazy Initialization
- [效能優化] 使用 esbuild 為你的構建提速 ?優化UI
- 幽默:編寫Python程式碼你們使用什麼偵錯程式?Python
- python程式程式碼這樣加密保護,你覺得可以嗎?Python加密
- 基於Apriori關聯規則的電影推薦系統(附python程式碼)Python
- 你知道python常見的庫有哪些嗎?五大python庫Python
- 帶引數的 Python 裝飾器讓你的程式碼更優雅Python
- 好用到哭!你需要立刻學會的20個Python程式碼段Python
- 讓你的Python程式碼更乾淨只需簡單一步Python
- 50 行 Python 程式碼,帶你追到最心愛的人Python