當前位置: 妍妍網 > 碼農

程式碼效率提升攻略,Python開發者必備工具集!

2024-05-29碼農

文章來源:Python開發者

今天為大家分享 程式碼效率提升攻略,Python開發者必備工具集,全文大約2300字,閱讀大約8分鐘!

這篇文章會提供一些最佳化程式碼的工具。會讓程式碼變得更簡潔,或者更迅速。

當然這些並不能代替演算法設計,但是還是能讓 Python 加速很多倍。

其實前面講演算法的文章,也有提到過。比如適用於雙向佇列的 deque,以及在合適的條件下運用 bisect 和 heapq 來提升演算法的效能。

而且前面也提到過,Python 提供了當今最高級也是最有效的排序演算法(list.sort)。

另外還有一個功能多樣又迅速的雜湊表(dict)。而且如果寫叠代器封裝、功能性程式碼或者是某種額外擴充套件的時候,或許CyToolz可以用得到。當然在itertools 和 functools 模組中,還有很多函式可以帶來很高效的程式碼。

這篇文章主要講最佳化單處理器的程式碼,下面會介紹一些一些高效的函式實作,也有已經封裝好的拓展模組,還包括速度更快的 Python 直譯器。

當然多處理器版本確實能大幅提高執行效率。如果想了解多核編程,可以從multiprocessing 模組開始。而且也能找到非常多的關於分布式計算的第三方工具。這裏可以看一下 Python wiki 上的關於 Parallel Processing 的內容。

接下來,會說一些關於Python 加速工具的選單。

NumPy、SciPy、Sage 和 Pandas

先說 NumPy,它的核心是一個多維數位陣列的實作。除了這個數據結構之外,還實作了若幹個函式和運算子,可以高效地進行陣列運算。並且對於被呼叫的次數進行了精簡。它可以被用來進行極其高效的數學運算。

SciPy 和 Sage 都將 NumPy 內建為自身的一部份,同時內建了其他的不同的工具,從而可以用於特定科學、數學和高效能計算的模組。

Pandas 是一個側重於數據分析的工具。如果處理大量半結構化數據的時候,可能也會用到 Pandas 相關的工具,比如 Blaze。

PyPy、Pyston、Parakeet、Psyco 和 Unladen Swallow

讓程式碼執行的更快,侵入性最小的就是使用即時編譯器(JIT 編譯)。以前的話我們可以直接安裝 Psyco。安裝之後匯入 psyco,然後呼叫 psyco.full()。程式碼執行速度就可以明顯提升。執行 Python 程式碼的時候,它可以即時監控程式,會將一部份程式碼編譯為了機器碼。

現在好多 Psyco 等加速器的計畫已經停止維護了,不過類似的功能在 PyPy 中得到了繼承。PyPy 為了方便分析、最佳化和轉譯,用 Python 語言將 Python 重新實作了一遍,這樣就可以 JIT 編譯。而且 PyPy 可以直接將程式碼轉譯成像 C 那樣的效能更高的語言。

Unladen Swallow 是一個 Python 的 JIT 編譯器。是 Python 直譯器的一本版本,被稱為底層虛擬機器(LLVM)。不過這個開發已經停止了。

Pyston 是一個與 LLVM 平台較為接近的 Python 的 JIT 編譯器。很多時候已經優於 Python 的實作,但不過還有很多地方不完善。

GPULib、PyStream、PyCUDA 和 PyOpenCL

這四個都是用在影像處理單元來實作程式碼的加速。前面講的都是用程式碼最佳化來實作加速的。而這些都是從硬體層面上進行加速,如果有一個強大的 GPU,我們可以用 GPU 來計算,從而減少 CPU 寶貴的資源。

PyStream 古老一點。GPULib 提供了基於 GPU 的各種形式的數據計算。

如果用 GPU 加速自己的程式碼,可以用 PyCUDA 和 PyOpenCL。

Pyrex、Cython、Numba 和 Shedskin

這四個計畫都致力於將 Python 程式碼轉譯為 C、C++和 LLVM 的程式碼。Shedskin 會將程式碼編譯為 C++語言。Pyrex、Cython 編譯的主要目標是 C 語言。Cython 也是 Pyrex 的一個分支。

而且,Cython 還有 NumPy 陣列的額外支持。

如果面向陣列和數學計算的時候,Numba 是更好的選擇匯入時會自動生成相應的 LLVM 的程式碼。升級版本是 NumbaPro,還提供了對 GPU 的支持。

SWIG、F2PY、Boost.Python

這些工具可以將其他的語言封裝為 Python 的模組。第一個可以封裝 C/C++語言。F2PY 可以封裝 Fortran。Boost.Python 可以封裝 C++語言。

SUIG 只要啟動一個命令列工具,往裏面輸入 C 或者 C++的表頭檔,封裝器程式碼就會自動生成。除了 Python,而且可以成為其他語言的封裝器,比如 Java 和 PHP。

ctypes、llvm-py 和 CorePy2

這些模組可以幫助我們實作Python 底層物件的操作。ctypes 模組可以用於在記憶體中構建編譯 C 的物件。並且呼叫共享庫中的 C 的函式。不過 ctypes 已經包含在 Python 的標準柯瑞面了。

llvm-py 主要提供LLVM 的 Python 介面。以便於構建程式碼,然後編譯他們。也可以在 Python 中構建它的編譯器。當然搞出自己程式語言也是可以的。CorePy2 也可以進行加速,不過這個加速是執行在組譯層的。

Weave、Cinpy 和 PyInline

這三個包,就可以讓我們在 Python 程式碼中直接使用 C 語言或者其他的高級語言。混合程式碼,依然可以保持整潔。可以使用 Python 程式碼的字串的多行特性,可以使其他的程式碼按照自身的風格來進行排版。

其他工具

如果我們要節省記憶體,就不能使用 JIT 了。一般 JIT 都太耗費記憶體。有一句話說的很對,時間和記憶體經常不能兼得,而我們在工程開發中,總是要尋找他們的平衡點。至於其他的一些東西,比如 Micro Python 計畫,這個是用在嵌入式裝置或者微控制器上面使用的。

如果只是想在 Python 環境中工作,然後想用別的語言,可以看看這個計畫Julia。