在python中为字典创建默认值

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.它专为此目的而设计.

  • 谁在乎它是否更慢(即使它是)?这是正确的解决方案.如果它成为一个瓶颈,请用手动调整的实现替换它.如果它成为stdlib,至少它的复杂性是可以接受的. (6认同)
  • @delnan:OP要求表现,显然他很关心.除此之外,我不同意pythonic心态`有(只)**一个**正确的解决方案`,这是主观的,我想知道我使用的是简洁,简单,快速,其中几个一次...并做出明智的选择 但在这种情况下,defaultdict显然具有简洁,高效和简单. (2认同)

Aar*_*lla 5

当然; 毕竟这是Python:只需使用defaultdict.