You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制scipy.integrate.quad占用的CPU核心数?

解决scipy.integrate.quad()占用全核心的办法

1. 把环境变量设置做在最前面

有时候哪怕你在导入scipy前设了环境变量,可能某些依赖已经偷偷加载了。试试这两种方式:

  • 直接在终端启动脚本前设置:
    Linux/macOS下:
    OPENBLAS_NUM_THREADS=1 python your_script.py
    
    Windows命令行:
    set OPENBLAS_NUM_THREADS=1 && python your_script.py
    
  • 或者把环境变量设置放在脚本的最最开头,比所有import都早:
    import os
    os.environ["OPENBLAS_NUM_THREADS"] = "1"
    os.environ["OMP_NUM_THREADS"] = "1"
    # 之后再导numpy、scipy这些
    import numpy as np
    import scipy.integrate as spi
    

2. 检查你的被积函数

quad本身是单线程的,但如果你的被积函数里用了numpy的大规模向量化操作(比如矩阵运算),这些操作会触发openblas的多线程。所以:

  • 看看被积函数里有没有这类操作,要么改成单线程执行,要么拆分计算别触发openblas的并行逻辑。
  • 如果被积函数里自己写了并行代码,直接删掉或者限制线程数。

3. 运行时强制改openblas线程数

要是环境变量不管用,试试直接调用openblas的接口改线程数:

import ctypes
# 注意不同系统的库文件名不一样:Linux是libopenblas.so,macOS是libopenblas.dylib,Windows是openblas.dll
openblas_lib = ctypes.CDLL("libopenblas.so")
openblas_lib.openblas_set_num_threads(1)

如果是conda环境,可能需要指定库的完整路径,比如/path/to/your/conda/env/lib/libopenblas.so。

4. 换单线程版的openblas

前面的方法都不行的话,直接装个单线程的openblas:

conda install scipy openblas=*=openblas_sequential

这样scipy用的就是单线程的openblas,从根儿上解决多线程占用的问题。

内容的提问来源于stack exchange,提问作者Calvin Adams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:20:29