使用 pyparsing 进行部分评估

2023-12-19

我需要能够采用使用 OpenDocument 公式语法的公式,将其解析为 Python 可以理解的语法,但无需评估变量,然后能够通过更改变量的值来多次评估该公式。 公式可以是用户输入,因此 pyparsing 使我能够有效处理公式语法并清理用户输入。有许多可用的 pyparsing 很好的例子,但所有数学例子似乎都假设人们立即评估当前范围内的所有内容。

作为背景,我正在研究工业经济模型(生命周期评估或 LCA),其中这些公式代表过程之间的物质或能量交换量。可变量可以是多个参数的函数,例如地理位置。公式链和变量引用存储在有向无环图中,因此始终可以简单地计算公式。公式作为字符串存储在数据库中。 我的问题是:

  1. 是否可以解析一个公式,以便解析的评估也可以存储在数据库中(作为要评估的字符串或其他内容)?
  2. 这种方法还有其他选择吗?请记住,理想的解决方案是解析/写入一次,然后读取多次。例如,部分解析公式,然后使用 ast 模块,尽管我不知道这如何与数据库存储一起使用。
  3. 我可以查看类似的项目或库的任何示例吗?我不是程序员,只是一名学生,试图在业余时间制作开源 LCA 软件模型的同时完成论文。
  4. 这种方法是否太慢了?我希望能够进行大量的蒙特卡罗运行,每次运行可能涉及数以万计的公式评估(这是一个大数据库)。

1)是的,可以对解析表达式的结果进行pickle,并将其保存到数据库中。然后您可以只获取并取消pickle表达式,而不是再次重新解析原始表达式。

2) 您可以仅使用编译和 eval 内置函数来快速完成此操作,如以下交互式会话所示:

>>> y = compile("m*x+b","","eval")
>>> m = 100
>>> x = 5
>>> b = 1
>>> eval(y)
501

当然,这存在任何基于 eval 或 exec 的实现的安全缺陷,因为不受信任或恶意的源字符串可能嵌入有害的系统调用。但如果这是你的论文并且完全在你的控制范围之内,那就不要做任何愚蠢的事情。

3) 您可以在 pyparsing wiki 的示例页面获取将表达式解析为“可评估”数据结构的在线示例。查看simpleBool.py http://pyparsing.wikispaces.com/file/view/simpleBool.py and 评估算术.py http://pyparsing.wikispaces.com/file/view/eval_arith.py尤其。如果你感觉很潮,可以订购一本过刊2008年5月号 http://pymag.phparch.com/c/issue/view/74Python 杂志的文章,其中有我的文章“使用 Pyparsing 编写简单的解释器/编译器”,其中更详细地描述了所使用的方法,以及如何对解析结果进行 pickle 和 unpickle 的工作原理。

4)缓慢的部分将是解析,因此您在以某种中间且可重复评估的形式保存这些结果方面处于正确的轨道上。 eval 部分应该相当敏捷。第二个缓慢的部分是从数据库中获取这些腌制的结构。在 MC 运行期间,我将打包一个函数,该函数获取表达式的选择参数、从数据库中获取、取消并返回可计算的表达式。然后,一旦您完成此工作,请使用 memoize 装饰器来缓存这些查询结果对,以便任何给定的表达式只需要获取/取消腌制一次。

祝你论文顺利!

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

使用 pyparsing 进行部分评估 的相关文章

随机推荐

  • 在 pandas 数据框中的两列之间传输值

    我有一个像这样的熊猫数据框 p q 0 5 0 5 0 6 0 4 0 3 0 7 0 4 0 6 0 9 0 1 所以 我想知道 如何将较大的值传输到 p 列 反之亦然的 q 列 将较小的值传输到 q 列 如下所示 p q 0 5 0 5
  • Lua中的线程优先级

    我看了Lua的书 了解到Lua中的多线程是协作的 我找不到的是有关线程优先级的一些信息 我猜想具有相同优先级的线程会运行直到完成 因为多线程是协作的 或者完成了收益 如果一个线程的优先级高于另一个线程呢 它是否能够中断优先级较低的线程 或者
  • 允许的内存大小 268435456 字节已耗尽[重复]

    这个问题在这里已经有答案了 可能的重复 允许的 X 字节内存大小已耗尽 https stackoverflow com questions 4096582 allowed memory size of x bytes exhausted 我
  • 反序列化 ArrayList。没有有效的构造函数

    这就是我反序列化包含标识对象的 arrayList 的方式 public void deserializeArrayList String path qbank IdentificationHARD quiz try FileInputSt
  • Nextjs 在生产服务器上部署后不使用图像 url 获取图像

    对于生产部署 我们有一个由 3 台 Linux 机器组成的网络 其中两个用于部署 一个是 nginx 代理 对于开发部署 我们有一台单独的 Linux 机器 在前端 这是一个 nextjs 框架 内部 设置了一个 http proxy mi
  • VB中可以继承带参数的sub new(构造函数)吗?

    在下面的代码中我收到编译错误 Error Too many arguments to Public Sub New on the Dim TestChild As ChildClass New ChildClass c 我没有收到它Test
  • ASP.NET MVC3:您可以发布并绑定对象数组吗?

    我的任务是创建一个表单 允许用户向其中添加一组或多组答案 例如 他们将从下拉列表中进行选择 然后将另一组输入添加到表单中 他们可以重复此过程 X 次 就服务器上的处理而言 处理此问题的最佳方法是什么 我知道我可以将每个元素绑定到一个列表 然
  • Cucumber 2.0.0 与 RubyMine 6.x 和 TeamCity 格式化程序不兼容

    我正在尝试在我的自动化测试套件中设置 Cucumber 我目前正在使用 Ruby 2 0 但在使用 Ruby 2 2 时也遇到了同样的问题 我尝试过 Cucumber 2 0 0 以及 2 0 0 beta 3 它们似乎都不与 Ruby 2
  • 在 Restlet 中上传带有描述的文件

    我需要上传一个文件使用一些附加数据restlet 所以我创建了一个示例 html 页面 如下所示 h1 Upload File with RESTFul WebService h1
  • Github企业API合并后删除分支

    我目前正在使用 Github API 企业版 经过一番尝试和错误后 我能够使用curl X POST 更改拉取请求的状态 curl u
  • 如何向 XML (XSD) 架构中的复杂类型添加限制?

    谁能帮我添加一个限制到这个模式文件 OwnerEnglishName 我知道如何使用简单类型来做到这一点 而在复杂类型中我不知道如何做到这一点 有人可以帮忙吗 多谢 原始 XML
  • kotlin android 片段返回后空回收器视图

    我有这个 android 片段 class MainFragment BaseFragment private val recyclerView by lazy find
  • 运行中的配置变量!框架

    我是 Play 的新手 编写了我的第一个应用程序 该应用程序有一组它所依赖的 URL 用于从中提取数据并在 XML 响应上返回有效的 URL 该应用程序需要在不同的环境 Dev Staging 和 Prod 中运行 并且每个环境都需要自己的
  • Google 语音识别 API:每个单词的时间戳?

    可以使用 Google 的语音识别 API 通过发出请求来获取音频文件 WAV MP3 等 的转录http www google com speech api v2 recognize 示例 我说过 一二三五 在 WAV 文件中 Googl
  • Mach-O 符号存根 (IOS)

    我正在尝试了解 Mach o 文件的工作原理 并且利用可用的在线资源 特别是这里的 Apple 页面 http developer apple com library mac documentation developertools con
  • 如何通过类名获取同级元素,然后仅使用 Javascript 隐藏它?

    我有这个 html 结构 div div div class content div 我想隐藏名为的类的元素content给定同级元素 id 为xyz 在 jQuery 中我可以轻松地这样做 xyz siblings content css
  • Google Analytics iOS 活动跟踪开发测试

    我正在尝试对我的 iOS 应用程序使用 Google Analytics iOS 活动跟踪 但在将我的应用程序上传到 Appstore 之前 我想知道一切是否正常工作 我想在以下函数处放置一个断点 application UIApplica
  • XSLT 获取特定标记的第一次出现

    假设我有一个完整的 html 文档作为 XML 输入 如果我只想输出 html 中的第一个 或任何 图像 XSLT 文件会是什么样子 选择第一个的一个 XPath 表达式 img 文档中的元素是 img 1 Do note that 一个经
  • 如何规避 Perl 的字符串转义 s/// 中的替换字符串?

    我不知道到底该怎么称呼它 但我已经能够用两条单行语句重现我的问题 从包含以下内容的文件 test txt 开始 foo 运行以下命令后 在 bash 中 perl n e s w oo 1ar print test txt 输出是 far
  • 使用 pyparsing 进行部分评估

    我需要能够采用使用 OpenDocument 公式语法的公式 将其解析为 Python 可以理解的语法 但无需评估变量 然后能够通过更改变量的值来多次评估该公式 公式可以是用户输入 因此 pyparsing 使我能够有效处理公式语法并清理用