在运行时动态设置Python解释器优化

Key*_*Usr 5 python interpreter assert cpython compiler-optimization

经过一段时间在这里寻找重复项后,我发现唯一的事情是无操作并使用 Cython 进行优化,这是完全不相关的。我想要完成的是在运行时动态设置python -O标志。

基本上,有一个值sys.flags.optimize是只读的。我正在寻找一个选项来更改它或找到一个可以更改该值并影响字节码生成的位置。

根据文档,官方方法是在解释器启动之前调用它,所以我想知道这是否可能,但这就是我发现的:

这似乎py_compile被称为“某处”(GitHub 搜索仅显示文档或测试,而不是运行时的实际调用者)并optimization_levelcompiler.c上面管理。这意味着我可以在 Python 中更改它,并让编译的解释器在同一会话/进程中对经过或不经过优化的代码进行汇编。

我似乎找不到 CLI 参数解析,也找不到任何可以在运行时更改的相关“状态”。

我的目标(目前)是选择性地允许/删除assert关键字,该关键字可以单独完成-O(通过compiler_assert()需要级别集,但是我正在努力寻找构建 AST 的 C 代码和实际的 Python 代码之间的“缺失的链接”)似乎保持配置状态(因为py_compile包含原始optimize值)并且似乎正在为解释器本身编译和加载字节码。

有什么方法可以改变,optimization_level以便我可以实现这种行为,并且几乎可以在单个 Python 会话中完成此操作?

>>> # change optimize to 1
>>> def test(): assert True
>>> import dis
>>> dis.dis(test)
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> # change optimize to 0
>>> dis.dis(test)
  1           0 LOAD_CONST               1 (True)
              2 POP_JUMP_IF_TRUE         8
              4 LOAD_GLOBAL              0 (AssertionError)
              6 RAISE_VARARGS            1
        >>    8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)