在函数内创建函数是否会产生经常性成本?

Hub*_*bro 3 python python-2.7

我正在用Python编写一个函数,我计划为每个脚本执行运行10000次或更多次.该函数当前包含3个子函数,但在脚本完成时可能包含20个或更多子函数.我是在想; 将一遍又一遍地声明这些功能(因为父功能将运行数千次)会产生经常性的性能成本,还是优化而不是问题?

将所有这些子功能分成一个类可以帮助提高性能吗?

(如果没有人知道他们头顶的答案,我打算对此进行测试并将结果发布在此处.)

Mar*_*ers 8

函数定义的性能影响可以忽略不计,与定义局部变量相当.

函数体仅编译一次,在执行代码块期间最终得到的所有内容都是加载已编译的块(LOAD_CONST),MAKE FUNCTION然后字节代码的结果存储在局部变量中:

>>> import dis
>>> def foo():
...     def bar():
...         pass
...     print 'boo!'
... 
>>> dis.dis(foo)
  2           0 LOAD_CONST               1 (<code object bar at 0x106c447b0, file "<stdin>", line 2>)
              3 MAKE_FUNCTION            0
              6 STORE_FAST               0 (bar)

  4           9 LOAD_CONST               2 ('boo!')
             12 PRINT_ITEM          
             13 PRINT_NEWLINE       
             14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

现在,如果您将包含嵌套函数的函数调用数千次,您会注意到该MAKE_FUNCTION操作对性能的影响:

>>> import timeit
>>> def nonlocal(): pass
... 
>>> def callnonlocal(): nonlocal()
... 
>>> def calllocal():
...     def localf(): pass
...     localf()
... 
>>> timeit.timeit('callnonlocal()', 'from __main__ import callnonlocal')
0.39106082916259766
>>> timeit.timeit('calllocal()', 'from __main__ import calllocal')
0.4878239631652832
Run Code Online (Sandbox Code Playgroud)

请注意,尽管您将更多实际代码添加到函数中,但这种差异会变小.以上示例非常有用,仅关注MAKE_FUNCTION字节代码对执行时间的影响.

首先要更好地优化可读性和可维护性.