Python 如何判断一段代码是否 CPU 密集?

CPU密集型程序的判断依据是CPU使用率持续接近100%且几乎不等待I/O、不阻塞、不频繁让出控制权;可通过top/htop、任务管理器或psutil实时监测,结合代码特征(大量数值计算、无显式等待、GIL影响明显)、time.process_time与perf_counter对比,以及cProfile分析热点函数来综合判定。

看 CPU 使用率是否持续接近 100%(单核

或整体),同时观察程序是否几乎不等待 I/O、不阻塞、也不频繁让出控制权——这是最直接的判断依据。

观察运行时的资源占用

代码运行时,用系统工具实时查看 CPU 占用:

  • Linux/macOS:终端中运行 tophtop,找到你的 Python 进程,看 %CPU 列是否长期稳定在 80%–100%
  • Windows:打开任务管理器 → “性能”选项卡 → 查看 CPU 曲线是否持续高位波动,再切换到“详细信息”找 python.exe 的 CPU 占用率
  • 更精准可配合 psutil 在代码中采样:psutil.Process().cpu_percent(interval=1) 连续测几次,若稳定 >90%,大概率是 CPU 密集

分析代码行为特征

不依赖工具,从逻辑上快速识别:

  • 大量数值计算:如矩阵运算(NumPy 未启用多线程 BLAS)、循环累加/排序/加密哈希、递归求解(斐波那契、DFS 暴力搜索)
  • 无显式等待:不含 time.sleep()requests.get()open().read()queue.get() 等 I/O 或同步阻塞调用
  • GIL 影响明显:纯 Python 循环(如 for i in range(10**8): total += i)在 CPython 下无法并行提速,多线程几乎不降 CPU 时间

对比执行时间与等待时间

time.perf_counter()time.process_time() 分开测量:

  • process_time() 只计 CPU 执行时间(不含休眠、I/O 等等待)
  • perf_counter() 计真实流逝时间
  • 如果两者非常接近(比如差值 perf_counter >> process_time,说明大量时间花在等待上(I/O 密集)

用 cProfile 看热点函数

运行 python -m cProfile -s cumtime your_script.py,重点关注:

  • cumtime(累计时间)且 tottime(自身耗时)也高的函数,尤其是纯 Python 函数(非 C 扩展)
  • 大量时间消耗在 built-in methodsumsortedlist.append 循环调用中
  • 没有长时间停在 selectrecvwrite 等系统调用上