在Python 2中检查/禁用字节码检查和重新生成

时间:2018-09-10 17:24:42

标签: python performance python-import python-internals

我想强迫Python使用我提供的预编译字节码文件,并避免其他任何“运行脚本”的行为,但浪费时间尝试重新生成字节码。但是,Python旨在使这种行为对用户大体透明,因此我找不到任何明显的方式来控制(甚至检查)它在这方面的工作。

我的问题

  1. 我是删除.py源的唯一选择,仅保留.pyc文件吗? (我不想这样做,因为事实证明在这种情况下,保持源代码对于调试非常有用。)
  2. 如何检查这种行为以查看实际情况?

背景和动机

我正在创建一个Python模块包,这些包将分布在只读网络文件系统上,并且我将预编译的字节码(.pyc)与Python包一起包括在内。我可以保证最终用户将始终在相同的Linux操作系统,相同的内核,相同的环境等环境中使用同一版本的Python,因此因此永远不必重新生成字节码< / strong>。 (这是针对中型科学实验的特殊设置,在该环境中,我们在为软件开发人员提供的环境中强制执行这些操作。此环境中的程序包管理器拒绝设置不按照我们指定的方式进行匹配。)

在这种情况下,我想确保Python不会尝试重新生成字节码或编写.pyc,因为我们要避免导入某些大型模块(matplotlib,scipy等)的启动时间过短。据我了解,Python的默认行为是

  1. 始终检查.pyc文件是否陈旧
  2. 总是如果该字节码过时,则重新生成该字节码
  3. 始终尝试用新的字节码覆盖.pyc文件,然后
  4. 从不告诉用户是否覆盖.pyc失败。

步骤1应该不是必需的,但是我对此并不担心,因为它只需要检查几个字节即可。我认为这不需要花费很多时间(即使是在我们的网络文件系统上,该文件系统已针对提供小型或部分二进制文件进行了优化)。对于具有许多.pyc文件的软件包,我想我可能是错的吗?

构建软件包后,就永远不需要第二步了。如果发生这种情况,则说明软件包管理中存在错误。

第3步将始终失败,因为这是一个只读文件系统。如果发生这种情况,那么我们需要了解它。

第4步令人沮丧,因为我不知道发生了什么。而且我已经看到模块(例如matplotlib)在这种情况下可以更快地加载到后续导入中,我不理解。

0 个答案:

没有答案