【问题标题】:Partial evaluation with pyparsing使用 pyparsing 进行部分评估
【发布时间】:2009-12-17 09:49:49
【问题描述】:

我需要能够获取使用 OpenDocument 公式语法的公式,将其解析为 Python 可以理解但不评估变量的语法,然后能够多次评估公式并改变变量的值. 公式可以是用户输入,因此 pyparsing 让我既可以有效地处理公式语法,又可以清理用户输入。有许多很好的 pyparsing 示例可用,但所有数学示例似乎都假设立即评估当前范围内的所有内容。

就上下文而言,我正在使用工业经济模型(生命周期评估,或 LCA),其中这些公式表示过程之间的材料或能量交换量。可变数量可以是几个参数的函数,例如地理位置。公式链和变量引用存储在有向无环图中,因此始终可以简单地评估公式。公式作为字符串存储在数据库中。 我的问题是:

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

【问题讨论】:

    标签: python parsing evaluation pyparsing


    【解决方案1】:

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

    2) 您可以只使用 compile 和 eval 内置函数对此进行快速而简单的传递,如下面的交互式会话中所示:

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

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

    3) 您可以在 pyparsing wiki 的示例页面上获得将表达式解析为“可评估”数据结构的在线示例。尤其是simpleBool.pyevalArith.py。如果你感觉很兴奋,请订购 Python 杂志的 May,2008 issue 的过刊,其中有我的文章“使用 Pyparsing 编写简单的解释器/编译器”,其中更详细地描述了所使用的方法,以及如何酸洗的描述并解开解析的结果。

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

    祝你的论文好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多