Python * .py,*。pyo,* .pyc:嵌入式系统可以取消哪些内容?

时间:2009-05-12 00:19:00

标签: python embedded

为了挤进我目前正在使用的嵌入式系统中可用的有限数量的文件系统存储,我希望消除任何可以合理删除而不会显着影响功能或性能的文件。 Python库中的* .py,*。pyo和* .pyc文件占用了相当大的空间,我想知道哪些选项对于小型嵌入式系统中的Python 2.6安装最合理:< / p>

  1. 保留* .py,消除* .pyc和* .pyo(保持调试能力,性能受损?)
  2. 保留* .py和* .pyc,消除* .pyo(优化真的可以买到什么吗?)
  3. 保留* .pyc,消除* .pyo和* .py(这会起作用吗?)
  4. 保留* .py,* .pyc和* .pyo(需要全部?)

5 个答案:

答案 0 :(得分:13)

http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

  

当使用-O标志调用Python解释器时,会生成优化代码并将其存储在“.pyo”文件中。优化器目前没有多大帮助;它只删除断言语句。

     

将两个-O标志传递给Python解释器(-OO)将导致字节码编译器执行优化,在某些极少数情况下可能会导致程序出现故障。目前只有 doc 字符串从字节码中删除,从而产生更紧凑的'.pyo'文件。

我给你的建议?

如果您不需要断言语句和__doc__字符串,请使用-OO仅编译 .pyo 文件。

否则,请仅使用 .pyc

修改

我注意到你只提到了Python库。如果您只需要部分功能,可以删除大部分python库。

我还建议您查看tinypy,它是大约64kb的Python子集。

答案 1 :(得分:3)

3号应该而且会起作用。您不需要.pyo或.py文件来使用已编译的python代码。

答案 2 :(得分:2)

我建议只保留.py文件。启动时间的差异并不是那么大,并且拥有源代码是一个优势,因为它将在不同的python版本下运行而没有任何问题。

从python 2.6开始,将sys.dont_write_bytecode设置为True将完全禁止编译.pyc和.pyo文件,因此如果您有2.6可用,则可能需要使用该选项。

答案 3 :(得分:1)

它最终归结为你真的只需要三个选项中的一个,但你最好的选择是使用.pys和.pyos或.pycs。

以下是我看到您的每个选项的方式:

  1. 如果将.pys放在zip文件中,则不会看到构建的pyc或pyos。还应该指出的是,性能差异仅在启动时间,即使这样我的经验也不是太大(尽管你的milage可能会有所不同)。另请注意,有一种方法可以防止解释器以。Algorias指出输出.pycs。
  2. 我认为这是一个理想的选择(或.pys和.pyos),因为您可以获得性能,可调试性和可靠性的最佳组合。您不一定需要源文件和编译文件。
  3. 如果你真的被困在空间并且需要性能,这将是有效的。如果可能的话,我建议你保留.pys。编译的二进制文件(.pycs或.pyos)并不总是转移到不同版本的python。
  4. 除非您计划有时以优化模式运行并且有时会以非优化模式运行,否则您将需要所有这三项是值得怀疑的。
  5. 就空间而言,我的(非常轶事)体验是.py文件压缩效果最佳,而.pycs和.pyos则将它们放在zipfile中。如果你计划压缩文件,.pyos在空间方面往往不会获得太多收益,因为文档字符串往往压缩得相当好,而断言只是不占用那么多空间。

答案 4 :(得分:1)

以下是我在日常工作中最小化主线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上,Python的默认路径已经包含/usr/lib/python27.zip,所以只需将zip文件放在那里就可以了。

os.pyo保留为普通(非压缩)文件,因为Python将其视为完整性检查。如果将其移动到zip文件,您将在每次Python调用时收到警告(尽管一切仍然有效)。或者你可以在那里留下一个空的os.py文件,并将真正的文件放在zip文件中。

最后的说明:

  • 以这种方式,Python适合7 MB的磁盘空间。还有很多可以做的减少尺寸,但7 MB足够小,我的目的。 :)
  • Python字节码在不同版本之间不兼容,但是谁在乎你是谁进行编译以及谁来控制Python版本?
  • 在所有情况下,zip文件中的
  • .pyo文件应该是性能获胜,除非磁盘速度非常快且处理器/ RAM非常慢。无论哪种方式,Python都是从内存而不是磁盘格式执行的,因此它只影响加载时的性能。虽然剥离文档字符串可以节省相当多的内存。
  • 请注意.pyo个文件不包含assert个语句。
  • .pyo文件保留了函数名称和行号,因此可调性不会降低:您仍然可以获得良好的回溯,您只需手动查找源代码中的行号,您必须执行此操作反正。
  • 如果要在运行时“破解”文件,只需将其放在当前工作目录中即可。它优先于库zip文件。