如何判断Numpy是否使用线程及利用系统可用核心?
这问题太接地气了!毕竟MATLAB自动多线程的体验太直观,换成Numpy总忍不住想确认下——到底有没有用上我机器的多核?下面分静态查询和运行时检测两类方法给你梳理:
一、静态查询:提前看配置,不用跑计算
这类方法能帮你先搞清楚Numpy的底层依赖库是否支持多线程,以及当前的线程配置:
查看Numpy的依赖配置
直接在Python里运行import numpy as np; np.show_config(),输出里重点关注BLAS和LAPACK的后端信息。比如如果看到mkl(Intel MKL)、openblas或者atlas这些,说明底层用的是支持多线程的计算库——Numpy本身不搞多线程,但这些后端库会自动帮你利用多核。
举个例子,如果输出里有blas_mkl_info,那就是用了MKL,默认是开启多线程的;如果是openblas_info,OpenBLAS也默认支持多线程,只是线程数可能受环境变量控制。检查控制线程数的环境变量
不同的后端库对应不同的环境变量,你可以直接打印这些变量的值来确认当前配置:import os # 针对MKL print(os.environ.get('MKL_NUM_THREADS')) # 针对OpenBLAS print(os.environ.get('OPENBLAS_NUM_THREADS')) # 通用的OpenMP变量(部分后端用这个) print(os.environ.get('OMP_NUM_THREADS'))如果这些变量有设置值,就代表线程数被明确指定了;如果是
None,一般就是用默认值(通常等于你机器的核心数)。
二、运行时检测:跑起来看实际表现
光看配置不够,实际跑起来验证才最靠谱:
用系统监控工具看CPU使用率
找个足够大的计算任务(比如大矩阵乘法:a = np.random.rand(10000, 10000); b = np.random.rand(10000, 10000); c = a @ b),然后打开系统监控:- Windows:任务管理器→详细信息,看Python进程的CPU使用率,如果超过100%(比如4核机器跑到300%-400%),那就肯定在多线程运行了。
- Linux/macOS:用
htop(Linux)或者活动监视器(macOS),同样看Python进程的CPU占用率,多核跑的时候会拉满多个核心。
用psutil库检测线程数变化
安装psutil(pip install psutil)后,你可以在计算前后对比进程的线程数:import numpy as np import psutil import time p = psutil.Process() print(f"计算前线程数: {p.num_threads()}") # 跑个大计算 a = np.random.rand(8000, 8000) b = np.random.rand(8000, 8000) c = a @ b time.sleep(1) # 等计算结束 print(f"计算后线程数: {p.num_threads()}")如果计算时线程数明显增加(比如从10左右涨到20+,取决于你的核心数),就说明后端库启动了多线程。
针对特定后端的直接查询
如果你知道用的是MKL,还可以直接查当前线程数:from mkl_fft._numpy_fft import _get_n_threads print(f"MKL当前线程数: {_get_n_threads()}")要是用的OpenBLAS,可以试试:
import ctypes openblas = ctypes.cdll.LoadLibrary("libopenblas.so") print(f"OpenBLAS当前线程数: {openblas.openblas_get_num_threads()}")(注意Windows下库文件名可能是
libopenblas.dll,macOS可能是libopenblas.dylib)
额外说明
最后补一句:Numpy本身的纯Python代码确实受GIL限制,但核心的数值计算逻辑都是调用底层的C/C++计算库(就是前面说的BLAS/LAPACK后端),这些库不受GIL约束,所以多线程的能力其实来自这些后端,Numpy只是“借”用了它们的能力~
内容的提问来源于stack exchange,提问作者gesouth81

