SciPy 中的平行執行支援#

SciPy 的目標是提供高效能的功能,也就是具有良好的執行速度。在現代運算硬體上,CPU 通常具有許多核心 - 因此使用者可以從平行執行中受益。本頁旨在簡要概述可用於採用平行執行的選項。

關於平行處理的一些重點

  • SciPy 本身預設為單執行緒執行。

  • 單執行緒預設的例外是呼叫 BLAS 或 LAPACK 函式庫以進行線性代數功能(直接或透過 NumPy)的程式碼。BLAS/LAPACK 函式庫幾乎總是預設為多執行緒執行,通常使用所有可用的 CPU 核心。

    • 使用者可以透過 threadpoolctl 控制 SciPy 和 NumPy 連結的 BLAS/LAPACK 函式庫的執行緒行為。

  • SciPy 功能可能會以選擇加入的方式提供平行執行。這透過個別 API 中的 workers= 關鍵字公開,該關鍵字接受一個整數,表示要使用的執行緒或程序數量,在某些情況下也接受類似 map 的可呼叫物件(例如,multiprocessing.Pool)。請參閱 scipy.fft.fftscipy.optimize.differential_evolution 以取得範例。

    • SciPy 內部執行緒處理是使用作業系統層級的執行緒池完成的。SciPy 內部未使用 OpenMP。

  • SciPy 與 multiprocessingthreading 搭配良好。前者比後者具有更高的 overhead,但被廣泛使用且穩健。後者可能會在某些使用情境中提供效能優勢 - 然而,請閱讀 SciPy 中的執行緒安全

  • 從 SciPy 1.15.0(和 Python 3.13.0、NumPy 2.1.0)開始,SciPy 對於自由執行緒 CPython 提供實驗性支援。

  • SciPy 在越來越多的子模組和函數中,對於 NumPy 以外的陣列函式庫(例如 PyTorch、CuPy 和 JAX)提供實驗性支援。這些函式庫預設為平行執行,並可能提供顯著的效能優勢(和 GPU 執行)。有關更多詳細資訊,請參閱 陣列 API 標準的支援