在生产中禁用 pyc 文件

Jar*_*key 5 python pyc python-2.7

pyc文件在过去一直是造成痛苦的原因,我最近刚刚看到一些关于阻止 python 生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但一般来说禁用它们会更容易。在我们的生产环境中禁用它们是否会产生我可能不知道的副作用?这样做有什么缺点?

我们遇到的唯一真正的问题是文件有时会过时,导致导入错误,并且在大规模重构后很难调试。一旦意识到这是一个 pyc 问题,修复起来就很简单,只需运行脚本即可,但在调试过程中可能需要 30 分钟才能意识到这一点。

小智 4

禁用编译字节码的写入和使用会在启动时带来性能成本 - 当进程生成时,您的 Python 代码会加载到内存中,并且非 .pyc/.pyo 文件意味着解释器被迫在启动时解析每个导入的文件。如果您当前正在从代码目录和导入中删除所有 .pyc 和 .pyo 文件,则您已经强制使用了该版本。

我很好奇它们过去在哪里引起了悲伤(您是否禁用文件系统上的修改时间?),就好像文件.py比文件.pyc、Python 解释器(至少在常见的实现中,包括 CPython)新,将重新编译源代码,但这对于这个问题的范围来说并不是很重要。

如果您在函数后面导入,例如:

def my_database_call(budget_id):
    import some_expensive_module_to_import
    some_orm(...).get(budget_id)
Run Code Online (Sandbox Code Playgroud)

在调用该函数之前(也许以后的每次调用也可能),不会产生导入成本。这与允许字节码(.pyc或“优化”.pyo文件)没有明显不同,但至少在这种情况下,您只需支付一次导入/解析/编译价格。

在您在评论中提到的情况下,如果您“向操作系统调用Python脚本”,并且不允许在该调用中写入字节码,则每次调用都会产生编译成本。