2014-08-27 67 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

相關問題