1358
Comentário:
|
← Revisão 7e 2008-09-26 14:05:56 ⇥
1774
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 implementar 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:
A partir do Python 2.4 é possível aplicar esse cache através de um decorator para funções sendo definidas por você:
Volta para CookBook.