Python可以优化这个简单的变量调用吗?

Gae*_*tan 3 python python-2.6

似乎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)

kin*_*all 5

CPython是Python的标准实现,没有做太多优化; 它是源代码到字节码的非常简单的翻译.抛出一些优化(在if __debug__其中一个代码中消除或提升代码)并且我确实认为有某种类型的窥视孔优化器,但我认为编译阶段意味着相当快,这排除了很多分析.

可维护性似乎也是核心Python开发人员的关键.这是2009年的一个帖子,其中考虑了去除死代码的补丁,然后被拒绝,因为它会使编译器不易维护.

如果你想要高性能,你需要的不是CPython; 也许PyPy会有所帮助.Python通常经过优化以节省程序员时间,而不是运行时.如果您不想在字节码中使用死代码,请不要将其放在源代码中.:-)

  • 你应该把它放回去:"如果你不想在你的字节码中使用死代码,不要把它放在你的源代码中." :) (2认同)