【问题标题】:Is there any performance difference between calling a local variable and calling an object's instance variable?调用局部变量和调用对象的实例变量之间是否存在性能差异?
【发布时间】:2014-08-27 15:43:10
【问题描述】:

这是我的代码:

        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

我最初的直觉是使用局部变量会更快,但我没有从 timeit 得到好的结果,所以我不能确定。

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

【问题讨论】:

  • 在计时时,使用您的计时应该显示的局部变量要快得多

标签: python optimization compiler-construction


【解决方案1】:

局部变量更快。 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.

【讨论】:

  • 太棒了,谢谢!没听说过 dis 模块,我会试一试我想知道的代码的其他部分......
  • 这对于真正深入 Python 非常有用。
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2013-03-22
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多