是否有可能知道两个python函数是否在功能上等效?

时间:2016-04-25 23:33:32

标签: python function

我们说我有两个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在功能上是否相同?

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

如果函数实际上是同一个对象,您只需执行f == g并查看它们是否是同一个对象。

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

等效(但可能更便携),您可以使用dis.dis获取相同的信息。请注意,这将受到漏报,如本案例所示。

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

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