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

Diferenças para "CacheDeFuncoes"

Diferenças entre as versões de 5 e 7 (2 versões de distância)
Revisão 5e 2006-01-24 01:51:09
Tamanho: 1354
Comentário: qualquer func que receba e retorne uma func pode ser aplicada como decorator
Revisão 7e 2008-09-26 14:05:56
Tamanho: 1774
Editor: localhost
Comentário: converted to 1.6 markup
Deleções são marcadas assim. Adições são marcadas assim.
Linha 9: Linha 9:
def cache_f(f): def cached(f):
Linha 11: Linha 11:
         Exemplo:
    >>> f = cache_f(math.sin)
    >>> f.cache
    {}
    >>> f(0)
    0.0
    >>> f(1)
    0.8414709848078965
    >>> f.cache
    {(1,): 0.8414709848078965, (0,): 0.0}

    Note que esta função *não* funciona com keyword arguments.
Linha 24: Linha 15:
        if args in g.cache:
            return g.cache[args]
        else:
        if args not in g.cache:
Linha 28: Linha 17:
     return g.cache[args]         return g.cache[args]
Linha 30: Linha 19:
    g.__doc__ = f.__doc__
    g.__name__ = f.__name__
Linha 33: Linha 24:
A partir do Python 2.4 é possível aplicar esse cache através de um decorator, um exemplo pode ser encontrado em [http://wiki.python.org/moin/PythonDecoratorLibrary#head-11870a08b0fa59a8622201abfac735ea47ffade5 Python Decorator Library - Memoize]. == Como usar ==

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

{{{
#!python
f = cached(math.sin)
print f.cache # Imprime {}
print f(0) # Imprime 0.0
print f(1) # Imprime 0.8414709848078965
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ê:

{{{
#!python
@cached
def test(number):
    print number
    return number ** 2

print test(10) # Imprime "10" e "100"
print test(10) # Imprime apenas "100"
print test(10) # Novamente, apenas "100"
print test(9) # Imprime "9" e "81"
print test(9) # Adivinhe? Apenas "81"
}}}
Linha 39: Linha 57:
RudaMoura RudaMoura, FelipeLessa

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