以下是我在日常工作中最小化主线 Python 2.7 的磁盘需求的方法:
1) 从标准库中删除您不需要的包。以下为保守名单:
bsddb/test ctypes/test distutils/tests email/test idlelib lib-tk
lib2to3 pydoc.py tabnanny.py test unittest
请注意,某些 Python 代码可能具有令人惊讶的依赖关系;例如setuptools 需要 unittest 才能运行。
2) 预编译所有 Python 代码,使用 -OO 去除断言和文档字符串。
find -name '*.py' | python -OO -m py_compile -
注意Python默认不查看.pyo文件;您还必须使用选项或环境变量在运行时明确要求优化。通过以下方式之一运行脚本:
python -OO -m mylib.myscript
PYTHONOPTIMIZE=2 python -m mylib.myscript
3) 删除.py 源代码文件(除非您需要将它们作为脚本运行)和.pyc 未优化文件。
find '(' -name '*.py' -or -name '*.pyc' ')' -and -not -executable -execdir rm '{}' ';'
4) 压缩 Python 库文件。 Python 可以从 zip 文件中加载模块。 zip 文件中的路径必须与包层次结构匹配;因此,您应该在压缩之前将site-packages 和.egg 目录合并到主库目录中。 (或者您可以在 Python 路径中添加多个 zip 文件。)
在 Linux 上,Python 的默认路径已经包含 /usr/lib/python27.zip,因此只需将 zip 文件放到那里即可开始使用。
将os.pyo 保留为普通(非压缩)文件,因为 Python 会将此作为完整性检查。如果将其移动到 zip 文件中,每次 Python 调用都会收到警告(尽管一切仍然有效)。或者您可以在此处留下一个空的os.py 文件,然后将真正的文件放入 zip 文件中。
最后的笔记:
- 以这种方式,Python 可容纳 7 MB 的磁盘空间。可以做更多的事情来减小大小,但 7 MB 对于我的目的来说已经足够小了。 :)
- Python 字节码在不同版本之间不兼容,但谁在乎何时是您进行编译而您控制 Python 版本?
-
.pyo zip 文件中的文件在所有情况下都应该是性能上的胜利,除非磁盘非常快并且处理器/RAM 非常慢。无论哪种方式,Python 都是从内存中执行的,而不是磁盘格式,因此它只会影响加载时的性能。虽然剥离文档字符串可以节省相当多的内存。
- 请注意
.pyo 文件不包含assert 语句。
-
.pyo 文件保留函数名称和行号,因此可调试性不会降低:您仍然可以获得很好的回溯,您只需手动查找源代码中的行号,无论如何您都必须这样做。
- 如果您想在运行时“破解”文件,只需将其放在当前工作目录中即可。它优先于库 zip 文件。