3

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

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

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

1 回答 1

4

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 杂志2008 年 5 月号的过刊,其中包含我的文章“使用 Pyparsing 编写简单的解释器/编译器”,其中对所使用的方法进行了更详细的描述,以及如何使用的描述酸洗和解酸解析结果有效。

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

祝你的论文好运!

于 2009-12-17T13:31:06.637 回答