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

2024-01-01

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

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

根据doc https://docs.python.org/3/tutorial/modules.html#compiled-python-files官方方法是在解释器启动之前调用它,所以我想知道这是否可能,但这就是我发现的:

  • Python/compiler.c -> c_optimize https://github.com/python/cpython/blob/99b54d68172ad64ba3d0fdc0137f0df88c28ea2b/Python/compile.c#L161
  • optimization_level https://github.com/python/cpython/blob/8462a4936b3a551dc546a6adea04a70b0a07ca67/Python/initconfig.c#L1251通过环境变量在 C 中设置PYTHONOPTIMIZE
  • Lib/py_compile.py https://github.com/python/cpython/blob/2e33ecd7c9b0cac3efc6fcbdd4547fd086b4e2d1/Lib/py_compile.py#L79

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

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

我的目标(目前)是选择性地允许/删除assert可以通过以下方式完成关键字-O单独(通过compiler_assert() https://github.com/python/cpython/blob/99b54d68172ad64ba3d0fdc0137f0df88c28ea2b/Python/compile.c#L3256需要级别集,但是我正在努力寻找构建 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

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时动态设置Python解释器优化 的相关文章

随机推荐

  • 在 RSpec 中调用相同的 rake 任务两次

    我正在尝试使用 rspec 测试 rake 任务 为此我需要调用它两次 但是 它只被调用一次 it first test do Rake Task my rake task invoke rake task was processed en
  • 将单击处理程序添加到 GWT 中的 Horizo​​ntalPanel

    如何添加点击处理程序HorizontalPanel 它与使用一起工作addDomHandler 在较新的 GWT 版本中 但我必须降级到不支持此功能的 GWT 2 0 4 我曾经这样做过 horizontalPanel getWidget
  • sqlite3 日期和间隔函数

    我想知道sqlite3是否支持间隔函数 以下语句被 PostgreSQL 接受 但 sqlite3 无法解析它 select from orders where and o orderdate lt date 1995 03 01 inte
  • 需要巧妙的想法:如何为不同的字体声明不同的大小? @字体脸?

    我从未见过这样做 但我有一种感觉 一定有一种聪明的方法可以做到这一点 css font size adjust 看起来从来都不是这样的 但是当我环顾四周时 我发现了一些非常巧妙的 css 技术 Take this http net tuts
  • cocoa touch中有没有好的HTML模板引擎? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在我的 iPhone 应用程序中 我想使用模板生成的一些 html 来填充 UIWebView 有没有像 jinja 或 smarty 这样的适用于
  • iOS 单元和 ui 测试中忽略了方案语言设置

    我的最终目标是发行 xcodebuild test 从命令行为不同的语言选择不同的方案 目前我有两个方案 它们之间唯一的区别是应用程序语言 在一种方案中是英语 在另一种方案中是西班牙语 如果我使用 Xcode 运行应用程序 它会很好地工作
  • 如何检查DLL依赖关系?

    有时 当我做一个小项目时 我不够小心 不小心添加了我不知道的 DLL 的依赖项 当我将此程序发送给朋友或其他人时 它不起作用 因为 某些 DLL 丢失了 这当然是因为程序可以在我的系统上找到 DLL 但不能在他们的系统上找到 有没有办法扫描
  • 在同步代码中实现需要 Task 返回类型的接口

    当实现一个返回一个接口的方法时Task
  • pandas:如何根据 X 列数是否大于某个数字来选择行?

    我可以用data data data gt 10 any 1 选择任意列大于 10 的行 如果我想选择任意 5 列大于 10 的行怎么办 以下内容应该适合您 data data data gt 10 count axis 1 gt 5 ex
  • 如何在emacs中使用[delete]键删除区域

    I am using Emacs 23 3 on Mac OS X Lion How can I delete the selected text region with simple key typing something like d
  • 如何在Python中获取网络接口卡名称?

    有没有办法获取机器中网卡的名称等 eth0 lo 如果是的话你会怎么做 我已经研究过 但到目前为止我只找到了获取IP地址和MAC地址的代码 例如 import socket socket gethostbyname socket getho
  • Apache Pulsar 函数的状态,如果我们不显式调用 deleteState,它会“永远”保留吗?

    当函数使用 context putState id object 时 保存的对象是否会永远保存在簿记员中 直到调用显式的 deleteState same id 为止 除了调用deleteState之外 是否有某个时间点 任何类型的某种操作
  • onPause 停止 LocationManager

    我想我这样做对吗 我有这段代码 它开始通过此处未显示的 MyLocationListener 方法查找我的 GPS 位置 该方法有效 但我想在暂停时停止 locationManager 我认为或者每当此活动不是当前的 但我无法获取删除更新代
  • 数据库中的数据格式值更改

    forms py DATE INPUT FORMAT d m Y m d Y class ReportForm forms ModelForm manual date forms DateField input formats DATE I
  • Ruby on Rails:对同一模型具有不同名称的两个引用

    我的应用程序有一个名为User 它包括电子邮件地址 用户名 我想创建一个模型Message它应该有两个字段sender and recipient 两者都引用了User模型 我试过这个 rails generate model Messag
  • 开发 Ruby gem 时如何添加“撬”

    我有一个叫做 某物 的宝石 我想在开发 gem 时添加 pry 作为开发依赖项 但我不知道如何加载它 如果我在 lib something rb 中有 需要某些东西 当我释放 gem 时 它会抛出一个 LoadError 因为 pry 只是
  • TAB 自动完成 python CLI

    我只是想知道是否可以编写一个在 shell 中运行的 Python 脚本 当用户点击 Tab 时可以向他们提供建议 例如 某些应用程序如何限制其支持的建议文件类型 我在 optParse 中没有找到任何可以做到这一点的东西 理想情况下是 m
  • HashMap 中的 Double

    我正在考虑使用 Double 作为 HashMap 的键 但我知道浮点比较是不安全的 这让我开始思考 Double 类上的 equals 方法也不安全吗 如果是 则意味着 hashCode 方法也可能不正确 这意味着使用 Double 作为
  • 当前身份(NT 机构/网络服务)没有写入权限

    我开发了一个简单的网络应用程序 一个标签和一个按钮 单击按钮时 标签将显示 Hello World 当我在 Web 服务器上部署此 Web 应用程序并访问 URL 时 收到此错误消息 当前身份 NT 权威 网络服务 不 有写权限 C Win
  • 在运行时动态设置Python解释器优化

    经过一段时间在这里寻找重复项后 我发现唯一的事情是无操作并使用 Cython 进行优化 这是完全不相关的 我想要完成的是动态设置python O运行时标记 基本上 有一个值sys flags optimize这是只读的 我正在寻找一个选项来