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 从 SciPy 1.15.0(以及 Python 3.13.0, NumPy 2.1.0)开始,对自由线程的 CPython 提供了 *实验性* 支持。
SciPy 在越来越多的子模块和函数中,对除 NumPy 之外的数组库(例如 PyTorch、CuPy 和 JAX)提供了 *实验性* 支持。这些库默认为并行执行,并可能提供显著的性能优势(以及 GPU 执行)。有关更多详细信息,请参阅 支持数组 API 标准。