我需要能够采用使用 OpenDocument 公式语法的公式,将其解析为 Python 可以理解的语法,但无需评估变量,然后能够通过更改变量的值来多次评估该公式。
公式可以是用户输入,因此 pyparsing 使我能够有效处理公式语法并清理用户输入。有许多可用的 pyparsing 很好的例子,但所有数学例子似乎都假设人们立即评估当前范围内的所有内容。
作为背景,我正在研究工业经济模型(生命周期评估或 LCA),其中这些公式代表过程之间的物质或能量交换量。可变量可以是多个参数的函数,例如地理位置。公式链和变量引用存储在有向无环图中,因此始终可以简单地计算公式。公式作为字符串存储在数据库中。
我的问题是:
- 是否可以解析一个公式,以便解析的评估也可以存储在数据库中(作为要评估的字符串或其他内容)?
- 这种方法还有其他选择吗?请记住,理想的解决方案是解析/写入一次,然后读取多次。例如,部分解析公式,然后使用 ast 模块,尽管我不知道这如何与数据库存储一起使用。
- 我可以查看类似的项目或库的任何示例吗?我不是程序员,只是一名学生,试图在业余时间制作开源 LCA 软件模型的同时完成论文。
- 这种方法是否太慢了?我希望能够进行大量的蒙特卡罗运行,每次运行可能涉及数以万计的公式评估(这是一个大数据库)。
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(使用前将#替换为@)