Tengamos un método que pueda almacenar en caché los resultados que calcula.Crear valores predeterminados para el diccionario en python
"Si" enfoque:
def calculate1(input_values):
if input_values not in calculate1.cache.keys():
# do some calculation
result = input_values
calculate1.cache[input_values] = result
return calculate1.cache[input_values]
calculate1.cache = {}
"Excepto" enfoque:
def calculate2(input_values):
try:
return calculate2.cache[input_values]
except AttributeError:
calculate2.cache = {}
except KeyError:
pass
# do some calculation
result = input_values
calculate2.cache[input_values] = result
return result
"GET/ha" enfoque:
def calculate3(input_values):
if not hasattr(calculate3, cache):
calculate3.cache = {}
result = calculate3.cache.get(input_values)
if not result:
# do some calculation
result = input_values
calculate3.cache[input_values] = result
return result
¿Hay alguna otra forma (más rápida)? ¿Cuál es el más pythonic? ¿Cuál usarías?
Nota: Hay una diferencia de velocidad:
calculate = calculateX # depening on test run
for i in xrange(10000):
calculate(datetime.utcnow())
Resultados: time python test.py
calculate1: 0m9.579s
calculate2: 0m0.130s
calculate3: 0m0.095s
su evaluación comparativa me parece sospechosa - No creo que el tercer método sea 100 veces más rápido. ¿Por casualidad reutilizaste el caché desde la primera vez? –
No estoy seguro, pero la enorme disparidad entre la primera ejecución y las ejecuciones posteriores puede deberse a que el intérprete compila la secuencia de comandos (probablemente sea mejor hacerlo en Python y luego en su OS cargar, iniciar, etc.). –
No. Eche un vistazo a http://files.myopera.com/ezimir/files/test.py Obteniendo '.keys()' es así de lento ... –