首页/新闻资讯/正文详情

SciPy 并行执行支持完全指南:多线程、进程池、BLAS 线程控制与自由线程 Python

发布时间:2026/9/23 2:26:20 来源:云帆数科 栏目:资讯中心
SciPy 并行执行支持完全指南:多线程、进程池、BLAS 线程控制与自由线程 Python
SciPy 并行执行支持完全指南多线程、进程池、BLAS 线程控制与自由线程 Python【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipySciPy 在默认情况下采用单线程执行但在现代多核 CPU 与 GPU 环境中通过合理利用 BLAS/LAPACK 线程、workers参数、multiprocessing/threading以及实验性的自由线程 Pythonfree-threaded CPython与数组库后端如 PyTorch、CuPy、JAX可以显著提升计算效率。本文基于 parallel_execution.rst 的核心内容结合 SciPy 源码与测试系统讲解如何安全、有效地在 SciPy 中启用并行计算。一、SciPy 的并行默认行为单线程为主SciPy 的设计目标是提供高性能performant的计算功能但在并行策略上采取保守默认SciPy 自身默认单线程执行。绝大多数 SciPy 例程如统计、插值、信号处理等在默认配置下不会主动创建额外线程。唯一的例外是调用 BLAS/LAPACK 库的线性代数功能直接调用或经由 NumPy 间接调用。BLAS/LAPACK 库几乎总是默认多线程执行通常使用所有可用的 CPU 核心。这意味着当你执行矩阵乘法、特征值分解、SVD 等操作时即便你的 Python 代码是单线程的底层 BLAS 库如 OpenBLAS、MKL可能已经并行运行。二、控制 BLAS/LAPACK 线程数threadpoolctl由于 BLAS/LAPACK 的线程行为由底层库决定SciPy 用户可以通过threadpoolctl精确控制线程数。threadpoolctl是一个独立库可在不重新安装 NumPy/SciPy 的情况下在运行时动态设置线程数。基本用法from threadpoolctl import threadpool_limits with threadpool_limits(limits2, user_apiblas): # 这里的所有 BLAS/LAPACK 调用最多使用 2 个线程 result scipy.linalg.svd(matrix)limits目标线程数整数。user_apiblas作用于 BLAS/LAPACK 相关的 OpenBLAS、MKL、BLIS 等库。这在多用户共享服务器、或者你希望在进程内控制总线程数时尤其有用。三、逐 API 选择并行workers参数SciPy 在多个 API 中通过workers关键字提供选择性opt-in并行具体形式有两种整数指定使用的线程数或进程数。map 风格可调用对象例如multiprocessing.Pool用于进程池映射。3.1scipy.fft.fft线程池并行scipy.fft模块的所有 FFT 函数fft、ifft、rfft、fftn、rfftn、hfft等均支持workers参数import scipy.fft x np.random.randn(1000, 256, 256) y scipy.fft.fftn(x, workers4)根据 scipy/fft/_basic.py 的 docstringworkers : int, optional并行计算使用的最大 worker 数。若为负数则从os.cpu_count()环绕取值即workers-1表示使用所有 CPU 核心。具体地workers参数指定将 FFT 计算拆分成的最大并行任务数。它执行x中独立的 1-D FFT因此要求x至少是 2-D且非变换轴足够大以便切分。如果x太小实际使用的任务数可能少于请求数。3.2scipy.optimize.differential_evolution进程池并行differential_evolution支持workers的两种形式见 scipy/optimize/_differentialevolution.pyfrom scipy.optimize import differential_evolution def func(x): return sum(x**2) # 整数形式划分种群并用进程池并行评估 result differential_evolution(func, bounds[(-5, 5)] * 10, workers4) # map 风格可调用对象形式 from multiprocessing import Pool with Pool(4) as pool: result differential_evolution(func, bounds[(-5, 5)] * 10, workerspool.map)文档明确说明若workers为整数则种群被划分为workers个片段并行评估使用multiprocessing.Pool。workers-1使用所有可用 CPU 核心。也可以提供 map 风格可调用对象如multiprocessing.Pool.map评估以workers(func, iterable)方式执行。当workers ! 1时该选项会覆盖updating关键字为updatingdeferred并覆盖vectorized关键字。要求func可 picklepickleable因为要跨进程传递。注意使用进程池时每次评估都会产生进程间通信开销。对于快速函数进程开销可能超过并行收益对于耗时长的目标函数进程并行通常是更优选择。四、SciPy 内部的线程实现OS 线程池而非 OpenMP一个经常被误解的点是 SciPy 是否使用 OpenMP。根据文档和源码SciPy 内部的线程化使用 OS 级线程池OS-level thread pools。OpenMP 不用于 SciPy 内部。也就是说FFT 等功能的并行是在 SciPy 自身的 C/C 层通过线程池实现的而不是依赖 OpenMP 编译指示。这也意味着在开启 SciPy 并行时不需要考虑 OpenMP 环境变量如OMP_NUM_THREADS对 SciPy 内部的影响但需要注意它可能影响链接的 BLAS 库。五、multiprocessingvsthreading如何选择文档给出了明确的指导multiprocessing开销更高进程创建、IPC 序列化但广泛使用且稳健robust。适合 CPU 密集且目标函数较重、需要隔离全局状态或避免 GIL 的场景。threading开销更低在某些使用场景下有性能优势但必须阅读 thread_safety.rst 中的线程安全说明。关键背景来自 thread_safety.rstSciPy 支持通过标准库threading模块在多线程环境中使用。许多 SciPy 操作会释放 GILNumPy 也是如此SciPy 大量功能是对 NumPy 函数的调用——因此与 Python 中的许多其他情况不同在 Python 中利用多线程并行提升性能是可行的。5.1 线程安全的边界最容易获得性能提升的方式每个工作线程拥有自己的数组对象线程间不直接共享数据。大部分时间在底层代码释放 GIL中运行的线程通常会并行执行。可以在线程间共享 NumPy 数组但对共享数组进行原地修改mutating时必须格外小心。SciPy 函数不会修改用户传入的数组除非某个函数明确文档说明会这样做这种情况很少。因此对同一个 NumPy 数组以线程方式调用 SciPy 函数是安全的。有状态stateful的类需要更多注意scipy.integrate和scipy.interpolate中的一些积分与插值对象通常能接受并行调用或抛出信息性错误如scipy.integrate.ode对不支持并行执行的积分方法可能抛出IntegratorConcurrencyError。scipy.spatial.KDTree是线程安全的创建后没有修改接口可安全地从多个线程同时查询。scipy.sparse中的稀疏数组和矩阵是可变的当前不线程安全。尤其要避免在多个线程间共享时对数据结构进行原地修改如 item 或 slice 赋值可能导致数据损坏、崩溃或其他异常。若必须支持共享修改需自行加锁或避免共享修改。六、实验性支持一自由线程 Pythonfree-threaded CPythonSciPy 1.15.0 起配合 Python 3.13.0、NumPy 2.1.0SciPy 提供对free-threaded CPython 的实验性支持即禁用 GIL 的 CPython 构建。在自由线程 Python 中没有 GIL 来串行化对 Python 对象的访问线程间修改共享状态、产生线程安全问题的机会更多。所有 SciPy 功能都经过了并行线程使用的测试但仍预期存在尚未发现的问题。若遇到问题请检查 free-threading 标签的 issue 并提交新 issue。由于没有 GIL 限制之前不释放 GIL 的操作在 threading 下没有收益的限制在自由线程构建下不再适用参见 thread_safety.rst。七、实验性支持二非 NumPy 数组库后端PyTorch、CuPy、JAXSciPy 在越来越多的子模块和函数中提供对其他数组库PyTorch、CuPy、JAX的实验性支持。这类库默认并行执行可能带来显著的性能提升并支持 GPU 执行。这通常是通过 SciPy 的数组 API 支持机制实现的参见开发文档中的dev-arrayapi说明。相关基础设施可参考 scipy/_lib/_array_api.py 等实现。例如在支持数组 API 的函数中传入 CuPy 数组即可在 GPU 上执行import cupy as cp x cp.random.randn(1024, 1024) # 若函数支持数组 API 后端则该调用在 GPU 上运行注意FFT 等函数对workers参数在非 NumPy 后端下有额外校验。例如 scipy/fft/_basic_backend.py 中当使用非 NumPy 数组库后端时传入workers会抛出ValueErrorxp_unsupported_param_msg因为该参数在那些后端下不受支持。八、实战总结如何选择并行策略场景推荐方案理由线性代数为主matmul、SVD、eig 等调 BLAS 线程threadpoolctl底层 BLAS/LAPACK 已默认多线程大规模 FFT多维、轴可切分scipy.fft.fftn(..., workersn)内部 OS 线程池拆分独立 1-D FFT全局优化、耗时的目标函数differential_evolution(..., workersn)或pool.map进程级并行需目标函数可 pickleCPU 密集、无共享状态、许多例程释放 GILthreading低开销注意线程安全边界需要进程隔离、稳健性优先multiprocessing广泛使用、稳健但开销更高GPU 或大规模并行硬件CuPy/PyTorch/JAX 数组后端默认并行 GPU 执行实验性自由线程 CPython3.13构建 free-threaded 版本无 GIL 限制实验性SciPy 1.15九、相关资源官方并行执行教程doc/source/tutorial/parallel_execution.rst线程安全专题doc/source/tutorial/thread_safety.rstFFT 的workers参数实现scipy/fft/_basic.py差分进化并行实现scipy/optimize/_differentialevolution.py多线程测试scipy/fft/tests/test_multithreading.py数组 API 基础设施scipy/_lib/_array_api.py小结SciPy 的并行能力是一个分层体系——默认单线程、BLAS/LAPACK 自动多线程、workers选择性并行、multiprocessing/threading应用级并行再加上实验性的自由线程 Python 与多数组库后端。理解每一层的适用边界与线程安全约束是写出高效且健壮并行代码的关键。【免费下载链接】scipySciPy library main repository项目地址: https://gitcode.com/gh_mirrors/sc/scipy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

30米土地覆盖栅格数据长时序分析实践:从原理到操作
30米土地覆盖栅格数据长时序分析实践:从原理到操作

做项目时手头没有历史影像底图,又需要快速摸清一个城市群过去三十多年地表到底发生了哪些变化,我最后选择了一套公开的30米分辨率土地覆盖栅格数据。这套数据覆盖1985到2025年,既能按全国范围看宏观格局,也能按省级、市级行政区直… · 2026/9/23 2:26:14

股市评论情感分析实战:基于Python机器学习与深度学习的文本分类方案
股市评论情感分析实战:基于Python机器学习与深度学习的文本分类方案

简介:这套基于Python机器学习与深度学习的股市评论情感分析毕业设计项目,主要解决股市评论情感倾向自动分析与市场走势联动可视化问题,面向计算机相关专业正在准备毕业设计、课程设计或期末大作业的学生,也适合希望进阶金融文本挖… · 2026/9/23 2:26:14

AI论文网站全攻略:从文献调研到润色审校的9款实用工具
AI论文网站全攻略:从文献调研到润色审校的9款实用工具

每年这个阶段,我后台收到最多的消息都是同一个主题:毕业论文写不出来了。研三的同学白天跑实验、晚上补数据,留给写作的时间被压得所剩无几。越来越多的人开始问我同一个问题:有没有什么AI论文网站,能让这个流程稍微轻… · 2026/9/23 2:26:14

MySQL批量更新方案详解:从循环逐条到临时表JOIN的性能对比与选型指南
MySQL批量更新方案详解:从循环逐条到临时表JOIN的性能对比与选型指南

1. 一次"半夜批量更新"翻车实录:问题从来不在SQL语法做后端开发这些年,我处理过不少跟"批量更新"有关的线上事故。坦白讲,绝大多数事故的根因不是SQL写错了,而是更新方式选错了。我第一次真正重视"批量更… · 2026/9/23 3:09:30

5分钟搭建QQ AI机器人:Lighthouse+Deepseek+AstrBot+Docker实战
5分钟搭建QQ AI机器人:Lighthouse+Deepseek+AstrBot+Docker实战

1. 为什么我要把AI塞进QQ里说实话,我一开始也是网页版AI的重度用户。每天开着浏览器标签页,写东西的时候切过去问两句,查资料的时候再切过去追问一轮。用久了就发现一个问题:我花在“打开AI”这件事上的时间,比用AI本身… · 2026/9/23 3:09:30

工业制氮设备选型误区与四维匹配模型解析
工业制氮设备选型误区与四维匹配模型解析

1. 工业制氮设备选型的认知误区与破局思路在工业气体设备采购领域,"厂家排名"搜索已经成为许多采购负责人的第一反应。以苏州地区为例,"苏州制氮机厂家排名"这类关键词每月搜索量超过2000次,反映出市场对标准化评价体系的… · 2026/9/23 3:09:24

Python数据结构:deque双端队列底层原理与性能实战对比
Python数据结构:deque双端队列底层原理与性能实战对比

1. 先搞清楚:为什么Python有了list还要设计deque我见过很多Python初学者,学到deque这一节时第一反应都是:list不也能在两端加元素吗?append往尾部加,insert(0, x)往头部加,功能上看着差不多,为什… · 2026/9/23 3:09:24

基于YOLOv8的电梯电瓶车检测报警系统实战
基于YOLOv8的电梯电瓶车检测报警系统实战

简介:基于YOLOv8的电梯内电瓶车闯入报警系统资源,面向计算机、人工智能、自动化等专业学生,适合毕业设计、课程设计或项目初期演示,也适合目标检测初学者进阶练习。资源实现电梯场景下电瓶车违规闯入的实时检测与报警,… · 2026/9/23 3:09:24

CSDN问答功能入口与实操指南:从冷启动到涨粉
CSDN问答功能入口与实操指南:从冷启动到涨粉

从写博客到认真经营创作者身份,我对CSDN最深的感受是:问答这块功能被严重低估了。很多人和我一样,早期只把CSDN当成“文章仓库”,写完往上一扔,数据好不好全看命。直到后来我认真研究了CSDN的问答功能入口位置&#xf… · 2026/9/23 3:09:12

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码