Пусть есть метод, который будет кэшировать полученные результаты.
"Если" подход:
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 = {}
"За исключением" подхода:
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
"получить/имеет" подход:
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
Есть ли другой (более быстрый) способ? Какой из них наиболее pythonic? Какой из них вы бы использовали?
Примечание: разница в скорости:
calculate = calculateX # depening on test run
for i in xrange(10000):
calculate(datetime.utcnow())
Результаты time python test.py
:
calculate1: 0m9.579s
calculate2: 0m0.130s
calculate3: 0m0.095s