似乎python(2.6)无法优化这个简单的临时变量'a'?
我用来为一些代码分配一个局部变量,以减少行长度.
对我来说,这是一个简单的优化任何正确的编译器可以自动执行
from dis import dis
def f(func):
func()
def functioncall():
print ' => function called'
def unoptimized():
print 'in unoptimized'
a = functioncall
f(func=a)
def optimized():
print 'in optimized'
f(func=functioncall)
unoptimized()
optimized()
print 'dis(unoptimized)'
dis(unoptimized)
print 'dis(optimized)'
dis(optimized)
Run Code Online (Sandbox Code Playgroud)
输出:
in unoptimized
=> function called
in optimized
=> function called
dis(unoptimized)
10 0 LOAD_CONST 1 ('in unoptimized')
3 PRINT_ITEM
4 PRINT_NEWLINE
11 5 LOAD_GLOBAL 0 (functioncall)
8 STORE_FAST 0 (a)
12 11 LOAD_GLOBAL 1 (f)
14 LOAD_CONST 2 ('func')
17 LOAD_FAST 0 (a)
20 CALL_FUNCTION 256
23 POP_TOP
24 LOAD_CONST 0 (None)
27 RETURN_VALUE
dis(optimized)
15 0 LOAD_CONST 1 ('in optimized')
3 PRINT_ITEM
4 PRINT_NEWLINE
16 5 LOAD_GLOBAL 0 (f)
8 LOAD_CONST 2 ('func')
11 LOAD_GLOBAL 1 (functioncall)
14 CALL_FUNCTION 256
17 POP_TOP
18 LOAD_CONST 0 (None)
21 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
为什么它不能自动删除?
11 5 LOAD_GLOBAL 0 (functioncall)
8 STORE_FAST 0 (a)
Run Code Online (Sandbox Code Playgroud)
CPython是Python的标准实现,没有做太多优化; 它是源代码到字节码的非常简单的翻译.抛出一些优化(在if __debug__其中一个代码中消除或提升代码)并且我确实认为有某种类型的窥视孔优化器,但我认为编译阶段意味着相当快,这排除了很多分析.
可维护性似乎也是核心Python开发人员的关键.这是2009年的一个帖子,其中考虑了去除死代码的补丁,然后被拒绝,因为它会使编译器不易维护.
如果你想要高性能,你需要的不是CPython; 也许PyPy会有所帮助.Python通常经过优化以节省程序员时间,而不是运行时.如果您不想在字节码中使用死代码,请不要将其放在源代码中.:-)