- 将 assets/logo.png 重命名为 assets/project-logo.png - 更新 README.md 中的logo图片路径引用 - 保持文件内容和显示效果一致
⚡ 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包管理器(可选)
📥 安装步骤
- 克隆项目仓库:
git clone https://drdfilenest.xyz:8443/root/PyGILnoGILBench.git
cd PyGILnoGILBench
- 验证运行环境:确保系统中已安装至少一个 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) |
测试流程
-
输入 Python 解释器路径:
脚本会提示输入需要的 Python 解释器路径(根据是否跳过测试类型决定):
Windows 示例:
1. 用于单线程测试的Python路径: C:\Python314\python.exe 2. 用于GIL多线程测试的Python路径: C:\Python314\python.exe 3. 用于NoGIL多线程测试的Python路径: C:\Python314\python3.14t.exeLinux/macOS 示例:
1. 用于单线程测试的Python路径: /usr/bin/python3 2. 用于GIL多线程测试的Python路径: /usr/bin/python3 3. 用于NoGIL多线程测试的Python路径: /usr/local/bin/python3.14t💡 提示:在静默模式下,将自动使用当前运行脚本的 Python 解释器。
-
查看测试结果:
测试完成后,脚本会生成直观的性能对比报告:
============================================================
测试完成! 性能对比报告如下:
============================================================
测试类型 耗时(秒) 相对速度 质数数量
------------------------------------------------------------
单线程 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 多线程性能测试更直观!
