功能内部功能 - 每次?

时间:2013-04-16 07:24:17

标签: python performance closures nested-function

我们有这个代码:

def big_function():
    def little_function():
         .......
    .........

Python文档说明了def语句:

  

函数定义是可执行语句。它的执行绑定   功能名称......

所以,问题是: 每次调用def little_function()big_function都会执行吗? 问题与def语句完全相同,而不是little_function()正文。

2 个答案:

答案 0 :(得分:31)

您可以使用dis模块检查字节码:

>>> import dis
>>> def my_function():
...     def little_function():
...             print "Hello, World!"
...     
... 
>>> dis.dis(my_function)
  2           0 LOAD_CONST               1 (<code object little_function at 0xb74ef9f8, file "<stdin>", line 2>)
              3 MAKE_FUNCTION            0
              6 STORE_FAST               0 (little_function)
              9 LOAD_CONST               0 (None)
             12 RETURN_VALUE  

正如您所看到的,内部函数的代码是编译一次。每次调用my_function时都会加载它并创建一个新的函数对象(在这种意义上,每次调用def little_function时都会执行my_function ,但是这不会增加太多开销。

答案 1 :(得分:9)

内部函数中的代码只编译一次,因此不应该有明显的运行时惩罚。

每次调用外部函数时,只有内部函数闭包才会更新。例如,有关闭包的更多详细信息,请参阅here

这是一个快速演示,检查关闭:

def f(x):
   a = []
   b = x + 1
   def g():
      print a, b
   return g

In [28]: y = f(5)

In [29]: y
Out[29]: <function __main__.g>

In [30]: y.func_closure
Out[30]: 
(<cell at 0x101c95948: list object at 0x101c3a3f8>,
 <cell at 0x101c958a0: int object at 0x100311aa0>)

In [31]: y.func_closure[1].cell_contents
Out[31]: 6