【问题标题】:Is it possible to know if two python functions are functionally equivalent?是否有可能知道两个 python 函数在功能上是否等效?
【发布时间】:2016-08-19 13:44:19
【问题描述】:

假设我有两个python函数fg

def f(x):
    y = x**2 + 1
    return y

def g(x):
    a = x**2
    b = a + 1
    return b

这两个函数在功能上显然是等效的(都返回x**2 + 1)。

我对功能等价的定义如下:

如果两个函数 fg 在相同的输入下总是产生相同的输出,那么 fg 在功能上是等效的。

此外,假设fg 中不涉及全局变量。

是否可以自动确定(无需人工检查)python 函数 fg 在功能上是否等效?

【问题讨论】:

  • 我猜你可以检查它们是否编译成相同的字节码,但这可能会产生假阴性。
  • 在误差范围内,只需尝试一堆随机输入。
  • @TigerhawkT3 你知道上面例子中的fg 是否会编译成相同的字节码?
  • @SlaterTyranus - def r1(): return random.random() - def r2(): return random.random().
  • 你可以用dis.dis(myfunction)检查字节码。如果两个函数确实编译为相同的字节码,它们必须在功能上是等效的(至少根据编译器)。然而,正如我在上面提到的和 Slater 指出的那样,可能存在误报 - 两个功能相同的函数的不同字节码。

标签: python function


【解决方案1】:

Rice's Theorem,没有。如果你能做到这一点,你可以解决halting problem。 (即使fg 总是保证停止也是如此。)

【讨论】:

  • 啊实际上这不是完全正确的,因为python函数不是抽象的、不透明的对象。您可以比较一下它们是否具有相同的字节码。
  • @Marcin:首先,no, comparing the bytecode doesn't work. At all. 其次,即使您添加了需要比较的其他显着特征,比较仍然无法将问题中的两个功能识别为等效。第三,图灵机也不是不透明的。您可以像比较和分析两个 Python 函数一样轻松地比较和分析两台图灵机,但是这两种分析都无法回答诸如“我的新算法是否给出与旧算法相同的结果?”这样的重要问题
  • 有时可以使用 SMT 求解器证明两个数学函数的相等性。这可以在in Haskell 完成,所以它也可以在 Python 中完成。
【解决方案2】:

如果函数实际上是同一个对象,你可以简单地f == g 看看它们是否是同一个对象。

其次,如果函数具有相同的字节码 (f.func_code.co_code),那么它们是等价的。

同样(但可能更便携),您可以使用dis.dis 来获取相同的信息。请注意,这将受到假阴性的影响,就像在这种情况下一样。

我知道dill 会更好,并允许您检索函数文本。有了这些信息,您可以使用ast 解析文本,并执行类似的分析以优化编译器,以确定代码是否可以“优化”到相同的语法树。同样,将有功能上等效的函数,不能简单地简化为相同的 ast。

所以,是的,对于某些功能等效的功能对,这种检测是可能的,但总会有误报。

【讨论】:

    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 2010-11-28
    • 2020-09-07
    • 1970-01-01
    • 2011-02-13
    • 2023-04-04
    • 2021-11-22
    • 2021-07-20
    相关资源
    最近更新 更多