pyc
文件过去一直是悲伤的原因,我刚刚看到一些关于阻止python生成它们的帖子。目前我们只是在任何代码更改后运行一个脚本来清理它们,以确保生成新的代码,但一般情况下禁用它们要容易得多。在我们的生产环境中是否有任何副作用可能是我不知道的?这样做有什么缺点?
我们遇到的唯一真正问题是文件过时会导致导入错误,并且在大量重构后难以调试。一旦意识到这是一个pyc问题,这是一个简单的修复,只需运行脚本,但这种实现可能需要30分钟的调试时间。
答案 0 :(得分:2)
您可以尝试将以下代码添加到主代码中。之后导入的任何模块都不会创建.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' s。
答案 1 :(得分:2)
禁用编译和使用已编译的字节码会在启动时带来性能成本 - 当进程生成时,您的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
文件)没有明显的不同,但至少在这种情况下,您只需支付该导入/解析/编译价格一次。
如果你在评论中提到的话,如果你“掏出”到OS来调用Python脚本,并且不允许在该调用中写入字节码,则每次调用都会产生编译价格。 / p>