Cython,一個簡化 Python 編寫 C 擴充套件的語言
Python 是當今使用最多的流行程式語言之一,因為:它是開源的,它有廣泛的用途(例如 Web 程式設計、業務應用、遊戲、科學程式設計等等),它有一個充滿活力和專注的社群支援它。這個社群可以讓我們在 Python Package Index(PyPI)中有如此龐大、多樣化的軟體包,用以擴充套件和改進 Python 並解決不可避免的問題。
在本系列中,我們將介紹七個可以幫助你解決常見 Python 問題的 PyPI 庫。首先是 Cython,一個簡化 Python 編寫 C 擴充套件的語言。
使用 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% 的執行時間。當然,得到了一個不錯的成果。
加把勁,我們可以讓它變得更快。
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,一個自動糾正程式碼格式錯誤的專案。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2645558/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 Cython 為 Python 編寫更快的 C 擴充套件Python套件
- 使用cython擴充套件python庫套件Python
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- C++對C語言的擴充套件(1)--引用C++C語言套件
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- SG :一個簡單的PHP語法糖擴充套件PHP套件
- 編寫可擴充套件程式套件
- 為Unity元件編寫擴充套件Unity元件套件
- 使用pybind11為Python編寫C++擴充套件(一)配置篇:Build(編譯和連結)PythonC++套件UI編譯
- 給IConfiguration寫一個GetAppSetting擴充套件方法APP套件
- Ace Editor 擴充套件編寫初步(轉)套件
- c 語言除錯方法(除錯 PHP 底層、擴充套件)除錯PHP套件
- [TIL] 使用scrcpy映象安卓裝置+編寫一個Raycast擴充套件安卓AST套件
- 寫一個Laravel中文驗證擴充套件包Laravel套件
- 寫一個ThinkPHP SwaggerV3 擴充套件包PHPSwagger套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 【譯】12個編寫乾淨且可擴充套件的JavaScript技巧套件JavaScript
- 一步步入門編寫PHP擴充套件PHP套件
- C-如何快速生成Python的C擴充套件.mdPython套件
- 編寫基於PHP擴充套件庫的後門PHP套件
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- Python擴充套件C/C++ 實現原理分析Python套件C++
- ✍ 寫一個擴充套件性較強的搜尋主頁套件
- 寫介面的藝術: 精簡,可擴充套件套件
- 寫了個根據表名初始化所有模型的擴充套件模型套件
- Cilium 1.3:支援Envoy、Cassandra和Memcached的Go語言擴充套件Go套件
- 兩個簡單的擴充套件方法:TrimPrefix和TrimSuffix套件
- C語言 編寫線段樹C語言
- C++ 對C的擴充套件有哪些C++套件
- 從零寫一個自動生成API文件的laravel擴充套件包APILaravel套件
- 寫了個 Laravel 高效樹結構生成的擴充套件Laravel套件
- C 擴充套件庫 – mysql API套件MySqlAPI
- 論如何自己寫一個Python的模板語言Python
- EFCore3.1+編寫自定義的EF.Functions擴充套件方法Function套件
- weex componet 簡單擴充套件套件
- 用 TS + Vue 寫了一個在 Chrome 中執行 Prettier 格式化的擴充套件程式VueChrome套件
- [擴充套件]laravel-xlswriter 一款基於xlswriter的laravel擴充套件包 excel極速讀寫套件LaravelExcel
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式