pyc
文件在过去一直是令人悲痛的原因,我最近刚刚看到一些关于防止 python 生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的,但通常禁用它们会容易得多。在我们的生产环境中禁用它们是否有任何我可能不知道的副作用?这样做有什么缺点?
我们遇到的唯一真正问题是有时文件过时导致导入错误,并且在大规模重构后难以调试。一旦意识到这是一个 pyc 问题,它就很容易修复,只需运行脚本即可,但在调试过程中可能需要 30 分钟才能实现。
pyc
文件在过去一直是令人悲痛的原因,我最近刚刚看到一些关于防止 python 生成它们的帖子。目前,我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的,但通常禁用它们会容易得多。在我们的生产环境中禁用它们是否有任何我可能不知道的副作用?这样做有什么缺点?
我们遇到的唯一真正问题是有时文件过时导致导入错误,并且在大规模重构后难以调试。一旦意识到这是一个 pyc 问题,它就很容易修复,只需运行脚本即可,但在调试过程中可能需要 30 分钟才能实现。
禁用编译字节码的编写和使用会在启动时产生性能成本——当进程产生时,您的 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 脚本,并且不允许在该调用中写入字节码,则每次调用都会产生编译成本。
您可以尝试将以下代码添加到您的 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 似乎没有其他好处。