Windows10下Scipy的spsolve函数性能远逊于MacOS的问题咨询
解决Windows下scipy.sparse.linalg.spsolve性能远低于MacOS的问题
我之前遇到过几乎一模一样的情况,结合你的描述——MacOS跑spsolve时CPU满负载、29秒搞定,Windows却只用到20%CPU还耗时377秒,大概率是Windows版本的SciPy没启用多线程线性代数库优化导致的。下面拆解原因和具体解决步骤:
核心原因分析
- MacOS上的SciPy默认会链接Apple专门优化过的Accelerate框架,里面的BLAS/LAPACK实现能充分压榨CPU多核性能;
- Windows默认通过pip安装的SciPy,往往用的是未做多核优化的参考版BLAS/LAPACK,导致
spsolve只能单线程或少量线程运行,自然跑不快,CPU占用也上不去。
具体解决办法
1. 替换为带优化线性代数库的SciPy版本
先卸载当前的SciPy,改用conda安装优化版:
# 卸载现有SciPy pip uninstall scipy -y # 用conda安装(如果没装conda,先装Miniconda/Anaconda) conda install scipy -c conda-forge
conda-forge提供的SciPy会自动链接OpenBLAS或MKL(根据环境适配),这两个都是原生支持多线程的线性代数库,能让spsolve充分利用所有CPU核心。
2. 手动强制多线程(针对OpenBLAS)
如果安装后CPU占用还是没拉满,可以设置环境变量强制OpenBLAS用全核心:
在Windows命令提示符里,先执行再跑脚本:
set OPENBLAS_NUM_THREADS=8 # 替换成你的CPU核心数,比如MacBook Pro 15一般是8核
或者直接在Python脚本开头添加:
import os os.environ['OPENBLAS_NUM_THREADS'] = '8' # 提前设置多线程参数
3. 验证优化效果
运行脚本时打开Windows任务管理器,观察CPU占用率是否接近100%。如果从20%拉满,说明优化生效,运行时间会大幅缩短(基本能追平MacOS的速度)。
额外排查点
- 确保Windows和MacOS用的是同版本的SciPy和NumPy,版本差异也可能带来性能偏差;
- 检查Windows下矩阵
A的加载状态,确认是稀疏矩阵格式(从你的代码看直接读取.mat的稀疏矩阵,大概率没问题)。
附上你的测试代码(方便其他人复现问题):
from scipy import array, linalg, dot import scipy.io as sio import numpy as np import time from scipy.sparse.linalg import spsolve matrix_names = ['cfd1'] for matrice in matrix_names: mat = sio.loadmat('/matrix_path/%s' % matrice) A = mat['Problem']['A'] A = A[0][0] matrix_size = np.shape(A)[0] xe = np.ones(matrix_size) b = A * xe start = time.time() X = spsolve(A, b) end = time.time() print("Times %.6f sec" % (end-start))
内容的提问来源于stack exchange,提问作者Fabrolly
相关产品推荐
相关产品推荐

