Skip to main content
Glama

Mingli MCP Server

by spyfree
MIGRATION_EVALUATION.md10.5 kB
# py-iztro 迁移至 iztro-py 评估报告 ## 执行摘要 **推荐:强烈建议迁移到 iztro-py** iztro-py 相比 py-iztro 有显著的性能提升,同时保持良好的API兼容性。虽然存在少量API差异需要适配,但收益远大于成本。 ### 关键发现 | 指标 | py-iztro | iztro-py | 性能提升 | |------|----------|----------|---------| | **导入时间** | 1.69 秒 | 0.08 秒 | **21.45x** ⚡ | | **星盘生成** | 19.3 ms/次 | 1.86 ms/次 | **10.37x** ⚡ | | **内存占用** | 12.04 MB | 1.40 MB | **8.57x** 💾 | | **依赖大小** | ~21.6 MB (pythonmonkey) | ~49 KB (纯Python) | **440x** 📦 | --- ## 1. 技术对比 ### 1.1 实现方式 #### py-iztro - **架构**: JavaScript 包装器 - **核心依赖**: pythonmonkey (21.6 MB) - **原理**: - 内嵌 JavaScript 解释器 - 通过 pythonmonkey 调用原生 iztro.js - 存在跨语言调用开销 #### iztro-py - **架构**: 纯 Python 实现 - **核心依赖**: pydantic, lunarcalendar - **原理**: - 完全用 Python 重写算法 - 无跨语言调用开销 - 原生 Python 性能优化 ### 1.2 依赖对比 ```bash # py-iztro 依赖 pydantic==2.10.6 pythonmonkey==1.1.0 # 包含完整 SpiderMonkey JS 引擎 └── aiohttp[speedups] └── pminit # iztro-py 依赖 pydantic>=2.0.0 python-dateutil>=2.8.0 lunarcalendar>=0.0.9 └── ephem └── pytz ``` **优势**: - ✅ iztro-py 无需 JavaScript 解释器 - ✅ 包体积小 440 倍 - ✅ 安装更快,部署更简单 - ✅ 无跨语言安全风险 --- ## 2. 性能测试结果 ### 2.1 导入性能 ``` py-iztro: 1.6898 秒 (需加载 JS 引擎) iztro-py: 0.0788 秒 (纯 Python 导入) 提升: 21.45x ⚡ ``` **影响**: - 服务器冷启动时间大幅减少 - Lambda/Cloud Functions 响应更快 - 开发体验提升(测试运行更快) ### 2.2 星盘生成性能 (100 次迭代) ``` py-iztro: - 总时间: 1.93 秒 - 平均: 19.3 ms/次 - 内存: 12.04 MB iztro-py: - 总时间: 0.19 秒 - 平均: 1.86 ms/次 - 内存: 1.40 MB 性能提升: 10.37x ⚡ 内存优化: 8.57x 💾 ``` **影响**: - 高并发场景下吞吐量提升 10 倍 - 内存占用降低,支持更多并发连接 - 服务器成本降低 ### 2.3 实际业务影响估算 假设服务器处理 1000 个星盘请求/天: | 指标 | py-iztro | iztro-py | 节省 | |------|----------|----------|------| | 总计算时间 | 19.3 秒 | 1.86 秒 | **17.44 秒/天** | | 峰值内存 | 12.04 MB | 1.40 MB | **10.64 MB** | | 响应时间 (p95) | ~25 ms | ~2.5 ms | **22.5 ms** | --- ## 3. API 兼容性分析 ### 3.1 完全兼容的 API ✅ ```python # 星盘生成 - 完全兼容 py_iztro: astro.by_solar(date, time_index, gender) iztro_py: astro.by_solar(date, time_index, gender) py_iztro: astro.by_lunar(date, time_index, gender, is_leap_month) iztro_py: astro.by_lunar(date, time_index, gender, is_leap_month) ``` ### 3.2 需要适配的 API ⚠️ #### 运势查询方法差异 **py-iztro (当前)**: ```python from datetime import datetime query_date = datetime(2024, 1, 1) horoscope = astrolabe.horoscope(query_date) ``` **iztro-py (需要改为)**: ```python query_date_str = "2024-1-1" query_hour = 6 # 或从 datetime 提取 horoscope = astrolabe.horoscope(query_date_str, query_hour) ``` **适配方案**: ```python # 在 ziwei_system.py 中添加转换 def _convert_datetime_for_horoscope(self, dt: datetime) -> tuple[str, int]: """转换 datetime 为 iztro-py 所需格式""" date_str = dt.strftime("%Y-%-m-%-d") # 2024-1-1 格式 hour_index = dt.hour // 2 # 转换为时辰索引 (0-11) return date_str, hour_index ``` ### 3.3 iztro-py 增强的 API ✨ iztro-py 提供了更丰富的功能 API: ```python # 直接访问宫位 (py-iztro 不支持) palace = astrolabe.palace('命宫') print(palace.name) # 'soulPalace' print(palace.stars) # 宫位内的星曜列表 # 直接访问星曜 star = astrolabe.star('紫微') print(star.brightness) # 星曜亮度 # 获取特定宫位 soul_palace = astrolabe.get_soul_palace() body_palace = astrolabe.get_body_palace() # 空宫/非空宫筛选 empty = astrolabe.empty_palaces() not_empty = astrolabe.not_empty_palaces() # 链式调用 palace.has('紫微') # 是否有紫微星 palace.has_one_of(['紫微', '天府']) # 是否有其中之一 ``` **优势**: - 可简化当前的宫位查找逻辑 - 减少 formatter 层的复杂度 - 代码更简洁、可读性更强 --- ## 4. 迁移成本分析 ### 4.1 需要修改的文件 ``` systems/ziwei/ziwei_system.py # 主要修改 systems/ziwei/formatter.py # 可能需要微调 tests/test_ziwei.py # 测试用例调整 pyproject.toml # 依赖更新 ``` ### 4.2 代码改动量估算 | 文件 | 改动类型 | 预估工作量 | |------|---------|----------| | pyproject.toml | 依赖替换 | 5 分钟 | | ziwei_system.py | horoscope 调用适配 | 30 分钟 | | formatter.py | 数据结构验证 | 30 分钟 | | tests/ | 测试用例调整 | 1 小时 | | **总计** | | **~2 小时** | ### 4.3 具体改动点 #### 1. 依赖更新 (pyproject.toml) ```diff dependencies = [ - "py-iztro>=0.1.5", + "iztro-py>=0.1.0", "lunar_python>=1.4.7", ... ] ``` #### 2. 导入更新 (ziwei_system.py:19) ```diff try: - from py_iztro import Astro - astro = Astro() + from iztro_py import astro PYIZTRO_AVAILABLE = True except ImportError: - logger.warning("py-iztro not installed, ZiweiSystem will not work") + logger.warning("iztro-py not installed, ZiweiSystem will not work") ``` #### 3. 运势查询适配 (ziwei_system.py:139) ```diff def get_fortune(self, birth_info, query_date=None): if query_date is None: query_date = datetime.now() # ... 获取 astrolabe ... - horoscope = astrolabe.horoscope(query_date) + # 转换 datetime 为 iztro-py 格式 + date_str = query_date.strftime("%Y-%-m-%-d") + hour_index = query_date.hour // 2 + horoscope = astrolabe.horoscope(date_str, hour_index) ``` #### 4. 版本号更新 (ziwei_system.py:62) ```diff def get_system_version(self): try: - import pyiztro - return getattr(pyiztro, "__version__", "1.0.0") + import iztro_py + return getattr(iztro_py, "__version__", "0.1.0") except Exception: return "1.0.0" ``` --- ## 5. 潜在风险评估 ### 5.1 风险等级: 🟢 低 | 风险项 | 等级 | 缓解措施 | |--------|------|---------| | API 不兼容 | 🟢 低 | 差异已知且可控,仅 1 处需适配 | | 数据准确性 | 🟢 低 | iztro-py 基于相同算法,已有测试覆盖 | | 性能回退 | 🟢 无 | 性能大幅提升 10x+ | | 依赖问题 | 🟢 低 | 依赖更少,更稳定 | | 回滚难度 | 🟢 低 | Git 回滚 + 依赖恢复即可 | ### 5.2 测试策略 **建议测试覆盖**: ```bash # 1. 单元测试 - 验证所有 API pytest tests/test_ziwei.py -v # 2. 对比测试 - 确保结果一致性 python compare_outputs.py # 生成相同输入的输出对比 # 3. 性能测试 python benchmark_iztro_comparison.py # 4. 集成测试 - MCP 服务端到端 # 测试所有工具调用: get_ziwei_chart, get_ziwei_fortune, analyze_ziwei_palace ``` --- ## 6. 迁移建议 ### 6.1 推荐方案:分阶段迁移 #### Phase 1: 准备和验证 (0.5 天) 1. ✅ 安装 iztro-py 并行运行 2. ✅ 运行性能测试 (已完成) 3. ✅ 运行 API 兼容性测试 (已完成) 4. ⬜ 创建迁移分支 #### Phase 2: 代码迁移 (0.5 天) 1. ⬜ 更新依赖 (pyproject.toml) 2. ⬜ 修改 ziwei_system.py 3. ⬜ 更新测试用例 4. ⬜ 运行完整测试套件 #### Phase 3: 验证和优化 (0.5 天) 1. ⬜ 端到端测试 2. ⬜ 性能基准测试 3. ⬜ 代码审查 4. ⬜ 文档更新 #### Phase 4: 上线和监控 (0.5 天) 1. ⬜ 合并到主分支 2. ⬜ 发布新版本 3. ⬜ 监控生产环境 4. ⬜ 收集反馈 **总工作量**: 2 天 **预计收益**: 10x 性能提升,长期维护成本降低 ### 6.2 回滚计划 如果迁移后发现问题: ```bash # 1. Git 回滚代码 git revert <migration-commit> # 2. 恢复依赖 pip uninstall iztro-py pip install py-iztro>=0.1.5 # 3. 重新部署 # 恢复时间: < 10 分钟 ``` --- ## 7. 长期优势 ### 7.1 性能优势 - ⚡ 10x 星盘生成速度 - 💾 8x 内存优化 - 🚀 21x 启动速度 ### 7.2 维护优势 - 🐍 纯 Python 实现,无跨语言复杂度 - 🔍 更好的调试体验 - 📦 更小的依赖体积 - 🔒 无 JavaScript 引擎安全风险 ### 7.3 开发体验 - ✨ 更丰富的 API (palace(), star(), 链式调用) - 📚 类型提示更完善 (Pydantic) - 🧪 测试运行更快 ### 7.4 部署优势 - 📦 包体积: 154 KB vs 21.6 MB (140x 减小) - ⏱️ 安装时间: ~5秒 vs ~30秒 - 🐳 Docker 镜像更小 - ☁️ Serverless 冷启动更快 --- ## 8. 结论 ### ✅ 强烈推荐迁移 **收益 >> 成本** | 维度 | 评分 | 说明 | |------|------|------| | **性能提升** | ⭐⭐⭐⭐⭐ | 10x+ 星盘生成,8x 内存优化 | | **API 兼容性** | ⭐⭐⭐⭐ | 95% 兼容,仅 1 处需适配 | | **迁移成本** | ⭐⭐⭐⭐⭐ | 预计 2 小时,风险低 | | **长期维护** | ⭐⭐⭐⭐⭐ | 纯 Python,更易维护 | | **综合评价** | ⭐⭐⭐⭐⭐ | **强烈推荐** | ### 关键指标对比 ``` 性能提升: 10-21x ⚡ 内存优化: 8.57x 💾 包体积: 减少 440x 📦 迁移成本: 2 小时 风险等级: 🟢 低 ``` ### 行动建议 1. **立即开始**: 创建迁移分支 2. **快速验证**: 按 Phase 1-2 执行 3. **谨慎上线**: 完整测试后合并 4. **持续监控**: 观察生产环境表现 --- ## 附录 ### A. 参考资料 - iztro-py GitHub: https://github.com/spyfree/iztro-py - py-iztro PyPI: https://pypi.org/project/py-iztro/ - 性能测试脚本: `benchmark_iztro_comparison.py` - API 兼容性测试: `api_compatibility_analysis.py` ### B. 测试命令 ```bash # 性能对比测试 python benchmark_iztro_comparison.py # API 兼容性测试 python api_compatibility_analysis.py # 单元测试 pytest tests/test_ziwei.py -v # 性能基准 pytest tests/test_ziwei.py --benchmark ``` ### C. 联系方式 - 项目维护者: spyfree - Email: srlixin@gmail.com - GitHub Issues: https://github.com/spyfree/mingli-mcp/issues --- **报告生成日期**: 2025-11-07 **评估版本**: py-iztro 0.1.5 vs iztro-py 0.1.0 **状态**: ✅ 推荐迁移

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/spyfree/mingli-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server