让我们编写一个能够缓存计算结果的方法。
“如果”方法:
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 = {}
"Except"方法:
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/has” 方法:
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
有没有其他更快的方法?哪个更符合Python风格?你会使用哪一个?
注意:速度上存在差异:
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
input_values not in calculate1.cache
?这是一个简单的哈希查找,可能接近其他方法(例如,<0.300秒)。 - user395760timeit
模块,它比time
函数给出的答案更准确。 - David Webb