associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "CacheDeFuncoes"

Diferenças entre as versões de 6 e 7
Revisão 6e 2006-02-05 19:06:18
Tamanho: 1774
Editor: FelipeLessa
Comentário:
Revisão 7e 2008-09-26 14:05:56
Tamanho: 1774
Editor: localhost
Comentário: converted to 1.6 markup
Nenhuma diferença encontrada!

Receita: Cache de Funções

Exemplo prático de uma função em Python que retorna uma outra função. Isto é possível porque funções em Python são elementos de primeira classe. Esta receita é uma função que recebe como parâmetro qualquer função (matemática) e retorna a mesma função do argumento com um cache associado para lembrar dos resultados calculados, o Cache é simplesmente um dicionário de argumentos da função com o valor calculado correspondende.

Código

   1 def cached(f):
   2     """Retorna uma funcao igual a 'f' mas com um cache associado.
   3 
   4     Note que esta função *não* funciona com keyword arguments.
   5     """
   6     def g(*args):
   7         if args not in g.cache:
   8             g.cache[args] = f(*args)
   9         return g.cache[args]
  10     g.cache = {}
  11     g.__doc__  = f.__doc__
  12     g.__name__ = f.__name__
  13     return g

Como usar

Para usá-la com funções já definidas ou no Python 2.3 ou mais antigo faça como no exemplo abaixo:

   1 f = cached(math.sin)
   2 print f.cache         # Imprime {}
   3 print f(0)            # Imprime 0.0
   4 print f(1)            # Imprime 0.8414709848078965
   5 print f.cache         # Imprime {(1,): 0.8414709848078965, (0,): 0.0}

A partir do Python 2.4 é possível aplicar esse cache através de um decorator para funções sendo definidas por você:

   1 @cached
   2 def test(number):
   3     print number
   4     return number ** 2
   5 
   6 print test(10) # Imprime "10" e "100"
   7 print test(10) # Imprime apenas "100"
   8 print test(10) # Novamente, apenas "100"
   9 print test(9)  # Imprime "9" e "81"
  10 print test(9)  # Adivinhe? Apenas "81"

Volta para CookBook.


RudaMoura, FelipeLessa