使用 Cython 為 Python 編寫更快的 C 擴充套件
在我們這個包含了 7 個 PyPI 庫的系列文章中學習解決常見的 Python 問題的方法。
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% 的執行時間。當然,得到了一個不錯的成果。
加把勁,我們可以讓它變得更快。
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,一個自動糾正程式碼格式錯誤的專案。
(題圖:Subgrafik San)
via: https://opensource.com/article/19/5/python-cython
作者:Moshe Zadka 選題:lujun9972 譯者:geekpi 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- Cython,一個簡化 Python 編寫 C 擴充套件的語言Python套件
- 為Unity元件編寫擴充套件Unity元件套件
- 使用C++為node.js寫擴充套件模組C++Node.js套件
- 使用pybind11為Python編寫C++擴充套件(一)配置篇:Build(編譯和連結)PythonC++套件UI編譯
- 編寫可擴充套件程式套件
- 利用Delphi編寫IE擴充套件套件
- 為PHP編譯imap擴充套件PHP編譯套件
- Ace Editor 擴充套件編寫初步(轉)套件
- 利用Delphi編寫IE擴充套件 (轉)套件
- 編寫自己的php擴充套件函式 (轉)PHP套件函式
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- C++使用ffpython嵌入和擴充套件pythonC++Python套件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 編寫基於PHP擴充套件庫的後門PHP套件
- 如何編寫一個獨立的 PHP 擴充套件PHP套件
- 編寫自己的php擴充套件函式(一) (轉)PHP套件函式
- 使用ctypes來擴充套件Python套件Python
- Python為什麼能擴充套件Python套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- 利用Delphi編寫Windows外殼擴充套件 (轉)Windows套件
- Go 語言編寫 CPython 擴充套件 goPyGoPython套件
- 用C語言擴充套件Python的功能C語言套件Python
- Windows 7 下用C++為node.js寫擴充套件模組WindowsC++Node.js套件
- C-如何快速生成Python的C擴充套件.mdPython套件
- [TIL] 使用scrcpy映象安卓裝置+編寫一個Raycast擴充套件安卓AST套件
- C# 擴充套件方法 借籤於 Objective-C 擴充套件類.C#套件Object
- C#基礎系列:擴充套件方法的使用C#套件
- Linux 核心使用的 GNU C 擴充套件(轉)Linux套件
- 如何編寫Vault外掛擴充套件Vault Explorer的功能套件
- 一步步入門編寫PHP擴充套件PHP套件
- C++ 對C的擴充套件有哪些C++套件
- C 擴充套件庫 – mysql API套件MySqlAPI
- C#.NET擴充套件方法C#套件
- 【譯】12個編寫乾淨且可擴充套件的JavaScript技巧套件JavaScript
- EFCore3.1+編寫自定義的EF.Functions擴充套件方法Function套件
- PDF 擴充套件包使用套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 一步步來用C語言來寫python擴充套件C語言Python套件