3

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

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

4

2 回答 2

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)

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

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

于 2016-06-07T03:43:38.690 回答
3

您可以尝试将以下代码添加到您的 main. 之后导入的任何模块都不会创建 .pyc:

import sys
sys.dont_write_bytecode=True

或者设置环境变量:

PYTHONDONTWRITEBYTECODE

您还可以编辑或创建您的usercustomize.py发现/site-packages以包含:

import sys
sys.dont_write_bytecode=True

也可以通过"-B"选项。至于删除或禁用 .pyc 生成,影响似乎很小或难以区分。生成 .pyc 以提高速度。不是程序的速度,而是加载所需的时间。如果您一直importing是一个模块,那么建议使用 .pyc,因为它可以减少所述模块的加载时间。经过研究,使用/生成 .pyc 似乎没有其他好处。

于 2016-06-07T03:25:49.693 回答