3

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

将所有这些子功能分成一个类是否有助于提高性能?

(如果没有人知道答案,我打算测试一下并在此处发布结果。)

4

2 回答 2

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        

现在,如果您调用包含嵌套函数的函数数千次,您会注意到该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

请注意,尽管您在函数中放入的实际代码越多,这种差异就会越小。上面的例子非常做作,只关注MAKE_FUNCTION字节码对执行时间的影响。

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

于 2012-09-14T20:52:49.720 回答
0

是的,在另一个函数中定义一个函数比在模块范围内定义函数有轻微的性能损失。

于 2012-09-14T20:53:30.680 回答