使用 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
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- Cython,一個簡化 Python 編寫 C 擴充套件的語言Python套件
- 使用cython擴充套件python庫套件Python
- 為Unity元件編寫擴充套件Unity元件套件
- 使用pybind11為Python編寫C++擴充套件(一)配置篇:Build(編譯和連結)PythonC++套件UI編譯
- 編寫可擴充套件程式套件
- Ace Editor 擴充套件編寫初步(轉)套件
- 使用ctypes來擴充套件Python套件Python
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- C-如何快速生成Python的C擴充套件.mdPython套件
- Python為什麼能擴充套件Python套件
- 編寫基於PHP擴充套件庫的後門PHP套件
- Python擴充套件C/C++ 實現原理分析Python套件C++
- Windows 7 下用C++為node.js寫擴充套件模組WindowsC++Node.js套件
- [TIL] 使用scrcpy映象安卓裝置+編寫一個Raycast擴充套件安卓AST套件
- C++ 對C的擴充套件有哪些C++套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- 一步步入門編寫PHP擴充套件PHP套件
- C 擴充套件庫 – mysql API套件MySqlAPI
- 【譯】12個編寫乾淨且可擴充套件的JavaScript技巧套件JavaScript
- EFCore3.1+編寫自定義的EF.Functions擴充套件方法Function套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Airbyte如何使用Temporal擴充套件工作流程編排?AI套件
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- C#中的擴充套件類的理解C#套件
- c盤擴充套件卷選項是灰的怎麼辦 c盤不能擴充套件卷的辦法套件
- python使用ctypes呼叫擴充套件模組的例項方法Python套件
- activiti通過擴充套件點重寫節點行為套件
- C++對C語言的擴充套件(1)--引用C++C語言套件
- Web編譯器Visual Studio擴充套件Web編譯套件
- 通過編寫指令碼和程式來擴充套件SSIS包NZ指令碼套件
- Source insight擴充套件宏使用套件
- burpsuite擴充套件開發之PythonUI套件Python
- Flutter——Dart Extension擴充套件方法的使用FlutterDart套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- VS Code 的 Python 擴充套件有大更新Python套件
- python算術運算子的擴充套件功能Python套件
- c# ExpandoObject動態擴充套件物件C#Object套件物件