Mar*_*óth 13 python performance coding-style
让我们有一个方法来缓存它计算的结果.
"如果"接近:
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 = {}
Run Code Online (Sandbox Code Playgroud)
"除了"方法:
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
Run Code Online (Sandbox Code Playgroud)
"获得/拥有"的方法:
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
Run Code Online (Sandbox Code Playgroud)
还有另一种(更快)的方式吗?哪一个最pythonic?你会用哪一个?
注意:有速度差异:
calculate = calculateX # depening on test run
for i in xrange(10000):
calculate(datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
结果time python test.py:
calculate1: 0m9.579s
calculate2: 0m0.130s
calculate3: 0m0.095s
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 24
使用collections.defaultdict.它专为此目的而设计.