[英]Create default values for dictionary in python
让我们有一个方法来缓存它计算的结果。
“如果”方法:
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
使用collections.defaultdict 。 它正是为此目的而设计的。
当然; 毕竟这是 Python:只需使用defaultdict 。
好吧,如果你想记住一些东西,最好使用 Memoize 类和装饰器。
class Memoize(object):
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if args not in self.cache:
self.cache[args] = self.func(*args)
return self.cache[args]
现在定义一些要记忆的函数,比如说一个关键强化函数,它确实说字符串哈希的 100,000 md5sums:
import md5
def one_md5(init_str):
return md5.md5(init_str).hexdigest()
@Memoize
def repeat_md5(cur_str, num=1000000, salt='aeb4f89a2'):
for i in xrange(num):
cur_str = one_md5(cur_str+salt)
return cur_str
@Memoize
函数装饰器等价于定义函数,然后定义repeat_md5 = Memoize(repeat_md5)
。 第一次为一组特定的参数调用它时,该函数需要大约一秒钟的时间来计算; 下次当它从缓存中读取时调用它几乎是瞬时的。
至于记忆方法; 只要你没有做一些愚蠢的事情(就像你if key in some_dict.keys()
if key in some_dict
而不是if key in some_dict
if key in some_dict.keys()
的第一种方法),就不会有太大的区别。 (第一种方法不好,因为你首先从字典中生成一个数组,然后检查键是否在其中;而不是仅仅检查键是否在字典中(参见像 pythonista 一样的编码))。 此外,捕获异常的速度自然比 if 语句慢(您必须创建一个异常,然后异常处理程序必须处理它;然后您才能捕获它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.