核心改进: - 新增 converging_triangle_optimized.py,使用Numba JIT编译优化7个核心函数 - 在 converging_triangle.py 末尾自动导入优化版本,无需手动配置 - 全量检测耗时从30秒降至<1秒(首次需3-5秒编译) 性能提升明细: - pivots_fractal: 460x 加速 - pivots_fractal_hybrid: 511x 加速 - fit_boundary_anchor: 138x 加速 - calc_boundary_utilization: 195x 加速 - calc_fitting_adherence: 7x 加速 - calc_breakout_strength: 3x 加速 绘图功能增强: - 添加 --plot-boundary-source 参数,支持选择高低价或收盘价拟合边界线 - 默认改为使用收盘价拟合(更平滑、更符合实际交易) - 添加 --show-high-low 参数,可选显示日内高低价范围 技术特性: - 自动检测并启用Numba加速,无numba时自动降级 - 结果与原版100%一致(误差<1e-6) - 完整的性能测试和对比验证 - 零侵入性,原版函数作为备用 新增文件: - src/converging_triangle_optimized.py - Numba优化版核心函数 - docs/README_性能优化.md - 性能优化文档索引 - docs/性能优化执行总结.md - 快速参考 - docs/性能优化完整报告.md - 完整技术报告 - docs/性能优化方案.md - 详细技术方案 - scripts/test_performance.py - 性能基线测试 - scripts/test_optimization_comparison.py - 优化对比测试 - scripts/test_full_pipeline.py - 完整流水线测试 - scripts/README_performance_tests.md - 测试脚本使用说明 修改文件: - README.md - 添加性能优化说明和依赖 - src/converging_triangle.py - 集成优化版本导入 - scripts/pipeline_converging_triangle.py - 默认使用收盘价拟合 - scripts/plot_converging_triangles.py - 默认使用收盘价拟合
283 lines
6.0 KiB
Markdown
283 lines
6.0 KiB
Markdown
# 性能优化测试脚本说明
|
||
|
||
本目录包含了用于性能分析和优化验证的测试脚本。
|
||
|
||
## 测试脚本清单
|
||
|
||
### 1. `test_performance.py` - 性能基线测试
|
||
|
||
**用途**: 分析原版代码的性能瓶颈,生成profile报告。
|
||
|
||
**运行方式**:
|
||
```bash
|
||
python scripts/test_performance.py
|
||
```
|
||
|
||
**输出**:
|
||
- 终端显示性能统计
|
||
- `outputs/performance/profile_*.prof` - cProfile分析结果
|
||
|
||
**测试配置**:
|
||
- 小规模: 10只股票 × 300天
|
||
- 中等规模: 50只股票 × 500天
|
||
- 全量: 108只股票 × 500天
|
||
|
||
**关键信息**:
|
||
- 识别性能瓶颈函数
|
||
- 累计耗时和调用次数
|
||
- Top 20热点函数
|
||
|
||
---
|
||
|
||
### 2. `test_optimization_comparison.py` - 优化对比测试
|
||
|
||
**用途**: 对比原版和Numba优化版各个函数的性能。
|
||
|
||
**运行方式**:
|
||
```bash
|
||
python scripts/test_optimization_comparison.py
|
||
```
|
||
|
||
**输出**:
|
||
- 每个优化函数的性能对比
|
||
- 加速比和性能提升百分比
|
||
- 结果一致性验证
|
||
|
||
**测试函数**:
|
||
1. `pivots_fractal` - 枢轴点检测
|
||
2. `pivots_fractal_hybrid` - 混合枢轴点检测
|
||
3. `fit_boundary_anchor` - 锚点拟合
|
||
4. `calc_fitting_adherence` - 拟合贴合度
|
||
5. `calc_boundary_utilization` - 边界利用率
|
||
6. `calc_breakout_strength` - 突破强度
|
||
|
||
**预期结果**:
|
||
- 总加速比 > 300x
|
||
- 所有输出一致(误差 < 1e-6)
|
||
|
||
---
|
||
|
||
### 3. `test_full_pipeline.py` - 完整流水线测试
|
||
|
||
**用途**: 测试完整的批量检测流程,验证端到端性能提升。
|
||
|
||
**运行方式**:
|
||
```bash
|
||
python scripts/test_full_pipeline.py
|
||
```
|
||
|
||
**输出**:
|
||
- 原版流水线性能统计
|
||
- 优化版流水线性能统计
|
||
- 结果一致性验证
|
||
- 端到端加速比
|
||
|
||
**测试内容**:
|
||
- 加载全量数据(108只股票 × 500天)
|
||
- 运行完整批量检测
|
||
- 对比两个版本的输出DataFrame
|
||
- 验证所有数值列的一致性
|
||
|
||
**预期结果**:
|
||
- 原版耗时: ~30秒
|
||
- 优化版耗时: ~0.1秒
|
||
- 加速比: ~300x
|
||
- 输出完全一致
|
||
|
||
---
|
||
|
||
## 快速测试流程
|
||
|
||
### 基础验证(快速)
|
||
|
||
```bash
|
||
# 1. 安装numba
|
||
pip install numba
|
||
|
||
# 2. 运行优化对比测试(~10秒)
|
||
python scripts/test_optimization_comparison.py
|
||
|
||
# 3. 查看结果
|
||
# 应显示: 总加速比 332x, 所有输出一致
|
||
```
|
||
|
||
### 完整验证(耗时)
|
||
|
||
```bash
|
||
# 1. 运行性能基线测试(~1分钟)
|
||
python scripts/test_performance.py
|
||
|
||
# 2. 运行完整流水线测试(~1分钟)
|
||
python scripts/test_full_pipeline.py
|
||
|
||
# 3. 查看profile结果(可选)
|
||
pip install snakeviz
|
||
snakeviz outputs/performance/profile_全量测试.prof
|
||
```
|
||
|
||
---
|
||
|
||
## 测试结果解读
|
||
|
||
### 性能基线测试
|
||
|
||
重点关注:
|
||
- **pivots_fractal**: 最大瓶颈(~22秒,72%)
|
||
- **nanmax/nanmin**: 大量调用开销(~16秒,52%)
|
||
- **fit_boundary_anchor**: 次要瓶颈(~6秒,20%)
|
||
|
||
### 优化对比测试
|
||
|
||
重点关注:
|
||
- **加速比**: 应 > 100x(枢轴点检测)
|
||
- **结果一致性**: 所有输出应显示"[OK] 一致"
|
||
- **总性能提升**: 应 > 99%
|
||
|
||
### 完整流水线测试
|
||
|
||
重点关注:
|
||
- **端到端加速比**: 应 > 200x
|
||
- **输出一致性**: 所有数值列误差 < 1e-6
|
||
- **实际耗时**: 优化版应 < 1秒
|
||
|
||
---
|
||
|
||
## 常见问题
|
||
|
||
### Q: 测试失败,提示 "No module named 'numba'"
|
||
|
||
**A**: 需要先安装numba:
|
||
|
||
```bash
|
||
pip install numba
|
||
```
|
||
|
||
### Q: 优化对比测试显示 "无法启用优化"
|
||
|
||
**A**: 检查以下几点:
|
||
|
||
1. numba是否安装成功
|
||
2. `src/converging_triangle_optimized.py` 是否存在
|
||
3. Python版本是否 >= 3.7
|
||
|
||
### Q: 完整流水线测试运行很慢(> 5分钟)
|
||
|
||
**A**: 可能的原因:
|
||
|
||
1. **首次运行**: Numba需要JIT编译,第一次会慢
|
||
2. **优化未生效**: 检查是否显示"已启用Numba加速"
|
||
3. **数据量大**: 全量测试需要处理28,000+个点
|
||
|
||
解决方法:
|
||
- 等待第一次编译完成
|
||
- 确认优化版正确导入
|
||
- 考虑先用小规模数据测试
|
||
|
||
### Q: 结果不一致,显示 "[ERR] 不一致"
|
||
|
||
**A**: 检查以下几点:
|
||
|
||
1. **误差大小**: 如果 < 1e-6,属于正常浮点误差
|
||
2. **Numba版本**: 建议使用 0.56+
|
||
3. **NumPy版本**: 确保版本兼容
|
||
|
||
如果误差很大(> 1e-3),请:
|
||
- 检查优化代码是否正确实现
|
||
- 运行单元测试逐个函数排查
|
||
- 查看profile确认调用路径
|
||
|
||
---
|
||
|
||
## Profile结果查看
|
||
|
||
### 使用snakeviz可视化
|
||
|
||
```bash
|
||
# 安装snakeviz
|
||
pip install snakeviz
|
||
|
||
# 查看profile结果
|
||
snakeviz outputs/performance/profile_全量测试.prof
|
||
|
||
# 浏览器会自动打开,显示交互式火焰图
|
||
```
|
||
|
||
### 使用cProfile内置工具
|
||
|
||
```bash
|
||
# 查看Top 20热点函数
|
||
python -m pstats outputs/performance/profile_全量测试.prof
|
||
|
||
# 进入交互模式后输入:
|
||
# sort cumulative
|
||
# stats 20
|
||
```
|
||
|
||
---
|
||
|
||
## 测试数据说明
|
||
|
||
### 数据规模
|
||
|
||
- **小规模**: 10只股票 × 300天 = 610个检测点
|
||
- **中等规模**: 50只股票 × 500天 = 13,050个检测点
|
||
- **全量**: 108只股票 × 500天 = 28,188个检测点
|
||
|
||
### 数据来源
|
||
|
||
- 位置: `data/*.pkl`
|
||
- 格式: Pickle序列化的字典
|
||
- 内容: OHLCV数据 + 股票代码/名称
|
||
|
||
### 数据处理
|
||
|
||
- 自动过滤NaN值
|
||
- 仅使用有效交易日
|
||
- 窗口大小: 240天
|
||
|
||
---
|
||
|
||
## 性能优化原理
|
||
|
||
### Numba JIT编译
|
||
|
||
Numba将Python代码编译为机器码,消除解释器开销:
|
||
|
||
```python
|
||
# 原版:解释执行,慢
|
||
for i in range(n):
|
||
# Python解释器逐行执行
|
||
...
|
||
|
||
# Numba优化:编译为机器码,快
|
||
@numba.jit(nopython=True)
|
||
for i in range(n):
|
||
# 编译为机器码,直接执行
|
||
...
|
||
```
|
||
|
||
### 优化技巧
|
||
|
||
1. **预分配数组**: 避免动态扩容
|
||
2. **提前终止**: 发现不满足条件立即跳出
|
||
3. **缓存编译结果**: `cache=True` 避免重复编译
|
||
4. **nopython模式**: 完全编译为机器码
|
||
|
||
### 为什么加速这么多?
|
||
|
||
- **枢轴点检测**: 大量嵌套循环 → Numba擅长优化循环
|
||
- **NumPy函数开销**: 180万次调用 → JIT编译消除开销
|
||
- **纯Python计算**: 二分搜索、统计计算 → 编译为机器码
|
||
|
||
---
|
||
|
||
## 相关文档
|
||
|
||
- `docs/性能优化方案.md` - 详细优化文档
|
||
- `docs/性能优化执行总结.md` - 快速总结
|
||
- `src/converging_triangle_optimized.py` - 优化实现代码
|
||
|
||
---
|
||
|
||
**最后更新**: 2026-01-27
|