2017-10-20 108 views
0

我正在使用遺傳算法來解決優化問題。 由於健身評估耗時,我使用記憶來加速計算。它是通過以下方式實現:使用字典進行Python記憶 - 性能問題

def memoize(f): 
    memo = {} 
    def helper(my_input): 
     if my_input not in memo: 
      if len(memo)%100000==0: 
       print('increased memo size:', len(memo)) 

      memo[my_input] = f(my_input) 
     return memo[my_input] 
    return helper 

@memoize 
def eval_fitness(individual): 
    #time consuming calc 
    return fitness 

我注意到,迅速在第一代備忘錄字典大小的增加,然後(在產生500例如達到14M鍵)增加得更慢。 memoization dictionary size

另一方面,隨着記憶的回報,每代的經過時間在第一代中是高的(即40秒),然後是下降。不過,如上圖所示,我注意到經過時間數據序列的非單調行爲:計算速度變慢,整體計算時間急劇增加。

我使用單個進程。內存使用率安全地低於20%。

  • 有關此行爲的根本原因的任何想法?
  • 我該如何避免這種慢下來?

回答

1

這可能是正確的行爲,你無法避免它。

隨着你的人口隨機變化,有很多新人出現的時刻。在這些時刻,記憶不會給予強大的時間改進(200-> 400代)。另一方面,如果人口穩定幾代人的記憶效果很好(大約200和〜410)。

P.S

良好的裝飾,但它是在functools模塊已實現爲lru_cache。

+0

謝謝你的回答。我編輯了我的問題,添加了每代字典大小的圖。實際上,這表明沒有人口穩定的這種時刻/很多新的個人;事實上,它與時間流逝的情節是不一致的。 –