SciPy 中的并行执行支持#
SciPy 的目标是提供高性能(即具有良好的执行速度)的功能。在现代计算硬件上,CPU 通常具有多个 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
配合良好。前者比后者的开销高,但被广泛使用且稳健。后者可能为某些使用场景提供性能优势,但是,请阅读 SciPy 中的线程安全。从 SciPy 1.15.0(和 Python 3.13.0、NumPy 2.1.0)开始,SciPy 对自由线程 CPython 提供实验性支持。
SciPy 在越来越多的子模块和函数中对 NumPy 之外的数组库(如 PyTorch、CuPy 和 JAX)提供实验性支持。这些库默认为并行执行,并且可能提供显著的性能优势(以及 GPU 执行)。有关更多详细信息,请参见 对数组 API 标准的支持。