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套件
- 用C語言擴充套件Python的功能C語言套件Python
- Go 語言編寫 CPython 擴充套件 goPyGoPython套件
- 一步步來用C語言來寫python擴充套件C語言Python套件
- 如何編寫一個獨立的 PHP 擴充套件PHP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- C++對C語言的擴充套件(1)--引用C++C語言套件
- Apache模組開發/用C語言擴充套件apache(3:一個非常簡單的apache module)ApacheC語言套件
- SG :一個簡單的PHP語法糖擴充套件PHP套件
- 編寫可擴充套件程式套件
- 用 C 語言編寫一個簡單的垃圾回收器
- C++11語言擴充套件:常規特性C++套件
- 編寫自己的php擴充套件函式(一) (轉)PHP套件函式
- 為Unity元件編寫擴充套件Unity元件套件
- 利用Delphi編寫IE擴充套件套件
- 可擴充套件客戶資訊語言 (xCIL) 簡介 (轉)套件
- [TIL] 使用scrcpy映象安卓裝置+編寫一個Raycast擴充套件安卓AST套件
- Ace Editor 擴充套件編寫初步(轉)套件
- 利用Delphi編寫IE擴充套件 (轉)套件
- 使用pybind11為Python編寫C++擴充套件(一)配置篇:Build(編譯和連結)PythonC++套件UI編譯
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- 寫一個Laravel中文驗證擴充套件包Laravel套件
- c 語言除錯方法(除錯 PHP 底層、擴充套件)除錯PHP套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 第一個C語言編譯器是怎樣編寫的?C語言編譯
- 第一個 C 語言編譯器是怎樣編寫的?編譯
- 【譯】12個編寫乾淨且可擴充套件的JavaScript技巧套件JavaScript
- 一步步入門編寫PHP擴充套件PHP套件
- gcc對C語言的擴充套件:語句內嵌表示式(statement-embeddedexpression)GCC語言套件Express
- 用 C 語言寫一個簡單的 Unix Shell(1)
- 用 C 語言寫一個簡單的 Unix Shell(2)
- Apache模組開發/用C語言擴充套件apache(4:一個生產環境使用的apache module)ApacheC語言套件
- 編寫基於PHP擴充套件庫的後門PHP套件
- 一個簡單的 PHP 時間處理擴充套件PHP套件
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件
- iOS擴充-語言國際化iOS
- 利用Delphi編寫Windows外殼擴充套件 (轉)Windows套件