SciPy 中的平行執行支援#
SciPy 的目標是提供高效能的功能,也就是具有良好的執行速度。在現代運算硬體上,CPU 通常具有許多核心 - 因此使用者可以從平行執行中受益。本頁旨在簡要概述可用於採用平行執行的選項。
關於平行處理的一些重點
SciPy 本身預設為單執行緒執行。
單執行緒預設的例外是呼叫 BLAS 或 LAPACK 函式庫以進行線性代數功能(直接或透過 NumPy)的程式碼。BLAS/LAPACK 函式庫幾乎總是預設為多執行緒執行,通常使用所有可用的 CPU 核心。
使用者可以透過 threadpoolctl 控制 SciPy 和 NumPy 連結的 BLAS/LAPACK 函式庫的執行緒行為。
SciPy 功能可能會以選擇加入的方式提供平行執行。這透過個別 API 中的
workers=
關鍵字公開,該關鍵字接受一個整數,表示要使用的執行緒或程序數量,在某些情況下也接受類似 map 的可呼叫物件(例如,multiprocessing.Pool
)。請參閱scipy.fft.fft
和scipy.optimize.differential_evolution
以取得範例。SciPy 內部執行緒處理是使用作業系統層級的執行緒池完成的。SciPy 內部未使用 OpenMP。
SciPy 與
multiprocessing
和threading
搭配良好。前者比後者具有更高的 overhead,但被廣泛使用且穩健。後者可能會在某些使用情境中提供效能優勢 - 然而,請閱讀 SciPy 中的執行緒安全。從 SciPy 1.15.0(和 Python 3.13.0、NumPy 2.1.0)開始,SciPy 對於自由執行緒 CPython 提供實驗性支援。
SciPy 在越來越多的子模組和函數中,對於 NumPy 以外的陣列函式庫(例如 PyTorch、CuPy 和 JAX)提供實驗性支援。這些函式庫預設為平行執行,並可能提供顯著的效能優勢(和 GPU 執行)。有關更多詳細資訊,請參閱 陣列 API 標準的支援。