我知道Python中的函数是一等公民,这意味着它们是function
类的对象,类似于5
是int
类的对象。这意味着在生命周期的某个时刻,将调用构造函数。对于大多数功能,我希望在定义它们时会发生这种情况(因为大多数功能可能只定义了一次),因此无论使用多少次,我们都只需支付一次构造费用。
但是嵌套函数呢?每次调用其父项时都将重新定义它们。这是否意味着我们每次都重新构造对象?如果是,那不是很低效吗?私有方法(假设父函数是一个方法)或另一个函数会效率更高吗?在此讨论中,我忽略了支持嵌套的范围限定的论点。
我运行了一个简单的实验,该实验似乎支持我的上述论点,因为内部函数的版本较慢:
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之类的编译语言有什么关系?我对嵌套和高阶函数产生了极大的兴趣,如果这个技巧看起来效率不高,那就太糟糕了。