繁体   English   中英

在python中为字典创建默认值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM