SciPy 中的并行执行支持#
SciPy 旨在提供高性能的功能,即具有良好的执行速度。在现代计算硬件上,CPU 通常具有许多 CPU 核心 - 因此用户可以通过并行执行受益。本页旨在简要概述可用的并行执行选项。
与并行性相关的关键点
SciPy 本身默认采用单线程执行。
该单线程默认的例外情况是调用 BLAS 或 LAPACK 库以进行线性代数功能(直接或通过 NumPy)的代码。BLAS/LAPACK 库几乎总是默认采用多线程执行,通常使用所有可用的 CPU 核心。
用户可以通过 threadpoolctl 来控制 SciPy 和 NumPy 链接的 BLAS/LAPACK 库的线程行为。
SciPy 功能可能会以选择加入的方式提供并行执行。这通过单个 API 中的
workers=关键字公开,该关键字接受用于线程或进程数量的整数,并且在某些情况下还接受类似映射的可调用对象(例如,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 标准的支持。