2016-11-25 49 views
-1

我正在測試計算機上的記憶代碼。我有範圍100000的數組。使用下面的代碼。在內存和速度方面更加昂貴Python中的列表或詞典

def fact1(n): 
    if n<1: 
     return 1 
    else: 
     fa=1 
     for i in range(1, n+1): 
      fa*=i 
     return fa 

使用記憶化技術,下面的代碼會是這樣,

memolookuptable={1:1, 2:2} 
    def fact2(n): 
     if n not in memoookuptable.keys(): 
      for i in range(3,n+1): 
       if i not in memoookuptable.keys(): 
        memolookuptable[i]=i*memolookuptable[i-1] 

從我的理解的代碼,雖然內存優化開始在低速運行記憶化。我是否正確理解記憶,避免通過存儲計算值來重新計算?如果這是正確的,那麼爲什麼更大的計算速度會減慢,儘管事實上計算出的值是可用的?

這是使用記憶法優化記憶和速度的最佳方法嗎?

+1

簡答題:列表使用的內存少於字典,在需要擴展時速度更快,如果知道索引,則列表查找比查找字典更快。但是,如果您需要在列表中搜索某個項目,那麼如果您知道該項目的密鑰,則該項目比直接訪問字典項目要慢得多。如果你不打算使用列表中的所有插槽,字典可以使用_less_ RAM。 –

+0

對不起,我寫了memo.keys()。我在寫代碼後意識到。謝謝!我的壞。 –

回答

1

你不需要撥打.keys() - 你可以簡單地使用if n not in memolookuptable:。我相信應該更快,因爲它使用哈希。 .keys()返回一個列表,查找速度較慢。

+1

'.keys()'在Python 2中返回一個列表,但在Python 3中返回一個動態的[Dictionary view object](https://docs.python.org/3/library/stdtypes.html#dictionary-view-對象),但在每個循環迭代中創建一個新對象仍然非常低效。 –

+1

有趣。我會盡量記住要麼查看2 vs 3,要麼注意到它是針對Python 2的。 – Lolgast