嵌套函数的性能开销是多少?[重复]


问题内容

这个问题已经在这里有了答案

在Python中嵌套函数时会有开销吗? (6个答案)

6年前关闭。

在Python中,可以嵌套如下函数:

def do_something():
    def helper():
        ....
    ....

除非Python更聪明地处理这种情况,否则helper每次使用时do_something都必须重新创建。实际上,这样做是否会对性能产生影响,而不是在主要功能之外创建帮助程序功能?如果是,那么效果有多大?


问题答案:

是的,在主函数中声明一个帮助程序要比分别声明它们慢:

### test_nested.py ###
import timeit
def foo():
    def bar():
        pass
    pass
print(timeit.timeit("foo()", setup="from __main__ import foo"))

### test_flat.py ###
import timeit
def foo():
    pass
def bar():
    pass
print(timeit.timeit("foo()", setup="from __main__ import foo, bar"))


### Shell ###
✗ python3 ./test_flat.py
0.42562198638916016
✗ python3 ./test_nested.py
0.5836758613586426

这是大约30%的速度下降。请记住,在这种琐碎的情况下,创建和调用函数是解释器的全部工作。在任何实际使用中,差异将小得多。