2017-10-20 39 views
0

J'utilise un algorithme génétique pour résoudre un problème d'optimisation. J'utilise la mémorisation pour accélérer le calcul car l'évaluation de la condition physique prend du temps. Il est mis en œuvre de la manière suivante:Memoization Python avec dict - Performance Numéro

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 

J'ai remarqué que la taille de la note de service dict augmente rapidement dans les premières générations, puis augmente plus lentement (par exemple atteindre les clés de 14M à la génération 500). D'autre part, le temps écoulé pour chaque génération est élevé (c'est-à-dire 40s) dans les premières générations, puis diminue, car la mémoisation est payante. Néanmoins, comme le montre l'image ci-dessus, j'ai remarqué un comportement non monotone de la série de données de temps écoulé: le calcul ralentit et le temps de calcul global augmente considérablement.

J'utilise un processus unique. L'utilisation de la mémoire est en sécurité de moins de 20%.

  • Des idées sur la cause sous-jacente de ce comportement?
  • Comment puis-je éviter ce ralentissement?

Répondre

1

C'est probablement comportement correct et vous ne pouvez pas l'éviter. Comme votre population change de façon aléatoire, il y a des moments où beaucoup de nouveaux individus se produisent. Dans ces moments, la mémorisation n'accorde pas d'amélioration importante du temps (200-> 400 générations). D'autre part, si la population se stabilise pendant quelques générations, la mémorisation fonctionne merveilleusement bien (environ 200 et ~ 410).

P.S

bon décorateur, mais il est déjà mis en œuvre dans le module de functools comme lru_cache.

+0

Merci de votre réponse. J'ai édité ma question en ajoutant l'intrigue de la taille du dictionnaire à chaque génération. En fait, cela indique qu'il n'y a pas de tels moments de stabilité démographique/beaucoup de nouveaux individus; en effet, il est incohérent avec le tracé temporel écoulé. –