2014-08-27 32 views
1

这里是我的代码:调用局部变量和调用对象的实例变量之间是否存在性能差异?

 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.score的d line.recog

我最初的本能,使用局部变量会更快,但我没有从timeit得到好的结果,所以我不能确切地说。

这是在一个for循环内,所以在这种情况下优化确实很重要。

+0

在计时上,使用本地变量的时间应该更快显示 – 2014-08-27 16:04:42

回答

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) 

证明完毕

+0

真棒,谢谢!如果没有听说过dis模块,我会给我一些关于代码的其他部分,我想知道... – Mitch 2014-08-27 15:57:51

+0

它对真正进入Python的深处非常有用。 – kindall 2014-08-27 15:59:02

相关问题