【问题标题】:What is the time complexity(theta) of evaluating an expression using parser module in Python3?在 Python3 中使用解析器模块评估表达式的时间复杂度(theta)是多少?
【发布时间】:2019-11-18 21:14:39
【问题描述】:

我想知道 Python3 中的解析器模块用于eval 表达式的算法或时间复杂度。

这是我的代码:

import random
import parser

equation_ = '(x**3 + 5*(x**2) - 3*x + 3) + (4*(x**5) - 2*(x**2) + 1)'

code = parser.expr(equation_).compile()
test_cases = [random.randrange(-100, 100) for _ in range(10)]

for x in test_cases:
    print(eval(code))

现在,我想知道使用了哪种算法或者该方法的时间复杂度是多少:parser.expr()eval()

我尝试阅读documentation,但无法弄清楚,source code 也是如此:parser.c 和 parser.h

【问题讨论】:

  • 您是在询问解析或评估的复杂性吗?以及表达式中的字符数、变量数等方面的复杂度是多少?
  • @Barmar 两者,我已经编辑了这个问题。谢谢。
  • 解析是O(n),求值就是方程本身的复杂度。
  • @Barmar 你是怎么做到的?看源码还是已经知道算法了?
  • 我知道这一点是基于我 40 年前对解析的了解。一般来说,解析器不需要做任何嵌套循环,它们只是顺序扫描输入。

标签: python c python-3.x


【解决方案1】:

我无法谈论 Python 的 parser 库中的具体算法,但通常解析是 O(n)。它使用正则表达式从文本中提取标记流,然后将其与语法模式进行匹配,这可以通过表查找来完成。处理语法中的嵌套结构可能涉及递归,但这一切都是通过对输入进行固定数量的扫描来完成的。我认为 Python 是一种上下文无关的语法,因此它应该可以通过一次解析。

一旦解析了表达式,评估它的复杂性就好像你用普通的源代码编写了那个表达式一样——eval() 只是对 Python 解释器的那个部分的调用。如果代码中没有循环,则为 O(n)。

【讨论】:

  • 谢谢@Barmar,很抱歉一开始没有描述这个问题。感谢您的耐心等待。
  • 请注意,对于解析这样的复杂操作,“时间复杂度”并不是很有意义。这些系数将比基于输入的增长要重要得多。
  • 注明。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多