|
|
本帖最后由 2010hook 于 2026-9-11 10:33 编辑
官网:https://www.python.org/downloads/windows/
用法:https://www.jianshu.com/p/8bd34d13415e
名称:Windows embeddable package
大小:10.5MB(3.13.15-embed-amd64)
运行 Python 脚本:PyPy vs 嵌入式 CPython,谁才是最优解?
一、背景
最近在优化一个下载并精简 MSVC 编译器的 Python 脚本,任务特征是:
- HTTPS 下载 VS 清单与资源包
- 解析多层嵌套 JSON
- SHA256 校验
- ZIP 解压与 MSI 调用
- 大量文件系统操作(复制、删除)
脚本属于典型的 I/O 密集型短任务,需要找一个既能跑起来、体积又小的 Python 运行环境。
- PyPy —— 带 JIT 的 Python 实现
- 嵌入式 Python(CPython Embeddable Package) —— 官方提供的最小化 CPython
结论:嵌入式 CPython 完胜。
二、体积对比:嵌入式 Python 完胜
嵌入式 Python(CPython)
- 压缩包:约 7 ~ 10 MB
- 解压后:约 12 ~ 20 MB
PyPy
- 压缩包:约 25 ~ 31 MB
- 解压后:仅 libpypy-c.dll 一个文件就有 46 MB,总体超 110 MB
结论:嵌入式 Python 的总体积通常不到 PyPy 的五分之一,分发更轻便。
三、性能对比:PyPy 的优势无法发挥
很多人选 PyPy 是冲着 JIT 加速去的,但在这个脚本里:
- 瓶颈在磁盘和网络,不在 CPU。JIT 再快也改变不了 I/O 等待。
- PyPy 的 JIT 需要预热:一般要执行上千次循环后才启动,短脚本还没热起来就跑完了,启动开销反而比 CPython 大。
- PyPy 在某些 I/O 场景下反而更慢:社区有报告指出,处理文件写入时 PyPy 的性能可能比 CPython 低数倍。
结论:对 I/O 密集型短脚本,PyPy 的 JIT 是“英雄无用武之地”,甚至可能是负担。
四、兼容性与易用性:嵌入式 Python 更省心
嵌入式 Python 的小注意点
- 一般标准的py脚本不必修改 python*._pth 或下载第三方库。
- 默认处于隔离模式,需要通过修改 python*._pth 启用导入site模块搜索路径。
- 官方文档称其不支持 pip,但社区已有成熟的解决方案,只需简单修改配置文件即可。
PyPy 的潜在风险
- Windows 上路径包含非 ASCII 字符时曾出现报错。
- 处理非 Unicode 路径时存在解码错误的历史问题。
- 脚本用的标准库通常兼容,但没必要引入未知风险。
结论:嵌入式 Python 的“小脾气”是可预知、可控的;PyPy 的兼容性问题是不可预知的。
五、最优解
嵌入式 CPython + 一个启动批处理(.bat)
具体做法:
- 下载官方 Embeddable Package,解压到脚本同目录。
- 简单标准.py不必修改 python*._pth(把 #import site 开头的#删除),报错再补充库。
- 写一个 @run.bat,设置好环境变量后调用 python.exe 主脚本.py。
- @echo off & pushd "%~sdp0"
- python --version
- python 010keygen.py
- python portable-msvc.py --accept-license --host x64 --target x64 --msvc-version 14.40 --sdk-version 26100
- pause
复制代码
这样得到的结果是:
- 体积小:20 MB 上下,远小于 PyPy
- 性能稳:I/O 场景不拖后腿
- 兼容好:官方 CPython,无冷门坑
- 体验佳:双击即用,无需装 Python
六、一句话总结
PyPy 适合 CPU 密集型的长期运行任务;对于 I/O 密集型的短脚本,嵌入式 CPython 在体积、性能、兼容性三方面全面胜出。
|
|