drd_vic ad0d8e1794 docs: 重命名项目logo并更新README引用
- 将 assets/logo.png 重命名为 assets/project-logo.png
- 更新 README.md 中的logo图片路径引用
- 保持文件内容和显示效果一致
2025-11-24 18:34:13 +08:00
2025-11-24 15:17:25 +08:00

PyGILnoGILBenchLogo

🚀 PyGILnoGILBench

Python GIL vs. NoGIL 多线程性能基准测试工具

Python Version NoGIL Support License Dependencies Status

Python 多线程性能对比工具 直观展示 GIL 限制与 NoGIL 并行的性能差异 支持自定义 Python 解释器、多种测试模式和灵活的输出格式

一个用于对比 Python 单线程、GIL 多线程、NoGIL 多线程 在 CPU 密集型任务上性能差异的专业基准测试工具。通过质数查找经典 CPU 密集型任务,直观展示 GIL全局解释器锁对 Python 多线程性能的影响,以及 NoGIL 版本的并行加速效果。

🚀 核心功能

  • 多模式对比测试支持同时测试单线程、GIL 多线程、NoGIL 多线程三种运行模式
  • 自定义 Python 解释器:允许指定不同 Python 版本的可执行文件(标准 GIL 版本、Python 3.13+ NoGIL 版本、PyPy 等)
  • 详细日志模式:通过 -v/--verbose 选项实时查看每个线程的运行日志
  • 静默模式:通过 -q/--quiet 选项使用默认参数,仅显示最终测试报告
  • 灵活输出格式:支持将测试报告保存为 JSON、CSV 或 TXT 格式
  • 测试控制选项:支持跳过特定测试类型、设置测试超时时间等
  • 直观性能报告:测试完成后生成包含耗时、相对速度等指标的对比报告

📋 适用场景

  • 开发者评估 Python NoGIL 版本对 CPU 密集型任务的加速效果
  • 学习和理解 GIL 对 Python 多线程性能的影响机制
  • 对比不同 Python 解释器在多线程场景下的性能表现
  • 优化 CPU 密集型任务的多线程实现方案

📁 项目结构

PyGILnoGILBench/
├── main.py                 # 基准测试主程序入口
├── pyproject.toml          # 项目配置文件
├── LICENSE                 # 许可证文件
├── README.md               # 项目说明文档
└── src/                    # 核心功能模块目录
    ├── primes.py           # 质数判断核心函数
    ├── single_thread.py    # 单线程实现方案
    ├── gil_thread.py       # GIL多线程实现动态负载均衡
    ├── nogil_thread.py     # NoGIL多线程实现静态任务划分
    └── test_worker.py      # 测试工作线程

🔧 环境要求

  • 操作系统Windows、macOS、Linux支持 Python 的所有平台)
  • Python 版本
    • 主程序运行环境Python 3.9 或更高版本
    • 至少 1 个标准 GIL 版本用于测试
    • 可选 1 个 NoGIL 版本Python 3.14+ Free Thread 版本 / 3.13.9+ Free Thread 版本 / Python 3.13+ 启用 --disable-gil 编译,或 PyPy
  • 依赖:无第三方依赖
  • 工具支持:项目配置支持使用 uv 包管理器(可选)

📥 安装步骤

  1. 克隆项目仓库
git clone https://drdfilenest.xyz:8443/root/PyGILnoGILBench.git
cd PyGILnoGILBench
  1. 验证运行环境:确保系统中已安装至少一个 Python 解释器GIL 或 NoGIL 版本),并能通过路径访问。

🎯 使用方法

基本命令

使用标准 Python 解释器运行:

python main.py [OPTIONS]

或使用 uv 包管理器(可选):

uv sync
uv run main.py [OPTIONS]

可用命令行选项

选项 描述
-h, --help 显示详细帮助信息并退出
-v, --verbose 启用详细模式,显示每个线程的实时运行日志
-q, --quiet 启用静默模式,使用默认测试参数,仅显示最终报告
-n NUM_PRIMES, --num-primes NUM_PRIMES 指定要寻找的质数总数默认30000
-t THREADS, --threads THREADS 指定多线程测试时使用的线程数默认CPU核心数
-s TEST_TYPE, --skip TEST_TYPE 跳过指定类型的测试可选值single, gil, nogil
-l TIMEOUT, --timeout TIMEOUT 单个测试的超时时间默认300
-o OUTPUT_FILE, --output OUTPUT_FILE 将测试报告保存到指定文件(支持格式:.json, .csv, .txt

测试流程

  1. 输入 Python 解释器路径

    脚本会提示输入需要的 Python 解释器路径(根据是否跳过测试类型决定):

    Windows 示例

    1. 用于单线程测试的Python路径: C:\Python314\python.exe
    2. 用于GIL多线程测试的Python路径: C:\Python314\python.exe
    3. 用于NoGIL多线程测试的Python路径: C:\Python314\python3.14t.exe
    

    Linux/macOS 示例

    1. 用于单线程测试的Python路径: /usr/bin/python3
    2. 用于GIL多线程测试的Python路径: /usr/bin/python3
    3. 用于NoGIL多线程测试的Python路径: /usr/local/bin/python3.14t
    

    💡 提示:在静默模式下,将自动使用当前运行脚本的 Python 解释器。

  2. 查看测试结果

    测试完成后,脚本会生成直观的性能对比报告:

============================================================
测试完成! 性能对比报告如下:
============================================================

测试类型            耗时()        相对速度         质数数量
------------------------------------------------------------
单线程             0.29         0.40        x 30000
GIL多线程          0.38         0.31        x 30000
NoGIL多线程        0.12         1.00        x 30000

============================================================

🔬 测试原理

核心测试任务

采用 质数查找 作为 CPU 密集型任务(无 I/O 操作,纯计算密集型):

  • 单线程实现:从 2 开始依次检查每个数字,直到找到指定数量的质数
  • GIL 多线程实现:使用动态负载均衡策略,通过共享计数器和锁机制,让多个线程竞争获取待检查的数字。这种方式避免了静态划分可能导致的负载不均问题,但在有 GIL 的环境下仍会受限于单线程执行速度
  • NoGIL 多线程实现:使用静态任务划分策略,将搜索范围预先均匀分配给每个线程。每个线程独立工作,无需锁竞争,能充分利用多核 CPU 资源实现真正的并行计算

性能影响因素

  • GIL 限制:标准 Python 的 GIL 导致多线程无法真正并行,仅能并发执行。线程切换和锁竞争会增加额外开销,因此 GIL 多线程在 CPU 密集型任务上可能比单线程更慢
  • NoGIL 并行:无 GIL 版本可充分利用多核 CPU 实现真正的并行计算。静态任务划分避免了锁竞争,显著提升 CPU 密集型任务性能
  • 线程数设置:线程数建议与 CPU 核心数一致。过多线程会导致上下文切换开销增加,可能降低整体性能
  • 任务复杂度:质数查找任务的复杂度随数值增大而增加,测试结果的可靠性与质数总数相关

常见问题

1. NoGIL 版本测试无加速效果

  • 检查线程数:线程数是否超过 CPU 核心数,导致上下文切换开销
  • 调整质数数量:测试的质数总数是否过小(建议至少 30000 以上,确保任务耗时足够长)
  • 验证解释器:是否正确使用了 NoGIL 版本的 Python

2. 测试结果不一致

  • 解释器一致性:确保所有 Python 版本的解释器路径正确,且无语法兼容性问题(推荐 Python 3.9+
  • 系统负载:检查测试时系统负载是否过高,避免运行其他 CPU 密集型任务
  • 多次测试:建议多次运行测试取平均值,以减少随机因素影响

3. 测试报告文件保存失败

  • 路径权限:检查文件路径是否正确,是否有写入权限
  • 文件格式:确保文件扩展名与支持的格式匹配(.json, .csv, .txt
  • Python 版本:确保使用的 Python 解释器版本兼容(推荐 Python 3.8+

📄 许可证

本项目基于 MIT 许可证 开源,您可以在遵守许可证条款的前提下自由使用、修改和分发本项目的代码。


PyGILnoGILBench —— 让 Python 多线程性能测试更直观!

Description
一个用于对比 Python 单线程、GIL 多线程、NoGIL 多线程 在 CPU 密集型任务上性能差异的基准测试工具。通过质数查找这一经典 CPU 密集型任务,直观展示 GIL(全局解释器锁)对 Python 多线程性能的影响,以及 NoGIL 版本的并行加速效果。
Readme MIT 5.5 MiB
v0.1.1 Latest
2025-11-24 15:17:51 +08:00
Languages
Python 100%