调用局部变量和调用对象的实例变量之间是否存在性能差异?

时间:2014-08-27 15:43:10

标签: python optimization compiler-construction

这是我的代码:

        elif line.mesg.startswith('^^'):
            recog, score = pull_recog(line)
            line.recog = recog
            line.score = score

            print recog + ' '*(20-len(recog)) + '%2.2f'%score

这个问题实际上归结为编译器如何解决这个问题:

编译器是否以某种方式优化此代码:

  1. 调用局部变量recogscore
  2. 调用对象的实例变量line.scoreline.recog
  3. 我最初的本能是使用局部变量会更快,但是我没有从timeit得到好的结果,所以我无法确切地说出来。

    这是在for循环中,因此在这种情况下优化确实很重要。

1 个答案:

答案 0 :(得分:3)

局部变量更快。 line.score是两个操作:局部变量检索(用于line)和属性查找(用于score)。而recog只是一个操作,而局部变量检索。一个操作比两个操作快,特别是当两个操作中的一个与一个操作相同时。

通过使用dis模块检查字节码,您可以非常轻松地看到这一点。

from dis import dis

def myfunc(recog, line):
    recog
    line.score

dis(myfunc)

这部分是对recog

的引用
 2           0 LOAD_FAST                0 (recog)

这是line.score

 3           4 LOAD_FAST                1 (line)
             7 LOAD_ATTR                0 (score)

Q.E.D。