每次调用父函数时,内部函数都会重新定义吗?

时间:2020-04-03 14:46:26

标签: python scala nested

我知道Python中的函数是一等公民,这意味着它们是function类的对象,类似于5int类的对象。这意味着在生命周期的某个时刻,将调用构造函数。对于大多数功能,我希望在定义它们时会发生这种情况(因为大多数功能可能只定义了一次),因此无论使用多少次,我们都只需支付一次构造费用。

但是嵌套函数呢?每次调用其父项时都将重新定义它们。这是否意味着我们每次都重新构造对象?如果是,那不是很低效吗?私有方法(假设父函数是一个方法)或另一个函数会效率更高吗?在此讨论中,我忽略了支持嵌套的范围限定的论点。

我运行了一个简单的实验,该实验似乎支持我的上述论点,因为内部函数的版本较慢:

import time

def f(x, y):
    def defined_inside(x, y):
        return x + y
    return defined_inside(x, y)

def defined_outside(x, y):
    return x + y

def g(x, y):
    return defined_outside(x, y)

start = time.time()
for i in range(10000000):
    _ = f(3, 4)
end = time.time()

print("Using inner function it took {} seconds".format(end - start))

start = time.time()
for i in range(10000000):
    _ = g(3, 4)
end = time.time()

print("Using outer function it took {} seconds".format(end - start))

结果:

Using inner function it took 2.494696855545044 seconds
Using outer function it took 1.8862690925598145 seconds

奖金问题:如果上述情况属实,那么情况与诸如Scala之类的编译语言有什么关系?我对嵌套和高阶函数产生了极大的兴趣,如果这个技巧看起来效率不高,那就太糟糕了。

0 个答案:

没有答案
相关问题