以下是我在日常工作中如何最小化主流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
目录合并到主库目录中。(或者您可以将多个zip文件添加到Python路径中。)
在Linux上,默认路径已包括/usr/lib/python27.zip
,因此只需将zip文件放置在那里即可。
将os.pyo
保留为普通文件(非压缩文件),因为Python会将其视为健全性检查。如果将其移动到zip文件中,每次调用Python时都会收到警告(尽管一切仍将正常工作)。或者你可以只留一个空的os.py
文件,并将真正的文件放在zip文件中。
最后注意事项:
- 通过这种方式,Python占用7MB的磁盘空间。还有很多可以做的来减小大小,但是7MB对于我的目的来说足够小了。 :)
- Python字节码在不同版本之间不兼容,但是当编译和控制Python版本的是你自己时,谁在乎呢?
.pyo
文件在zip文件中应该在所有情况下都是性能优势,除非磁盘速度极快且处理器/内存极慢。无论哪种方式,Python都是从内存中执行,而不是从磁盘格式中执行,因此它仅会影响加载时的性能。尽管剥离文档字符串可以节省相当多的内存。
- 请注意,
.pyo
文件不包含assert
语句。
.pyo
文件保留函数名称和行号,因此调试性并没有降低:您仍然可以获得良好的跟踪信息,只需手动查找源代码中的行号,这也是必须要做的。
- 如果要在运行时“hack”文件,请将其放在当前工作目录中。它优先于库zip文件。