Créer des valeurs par défaut pour le dictionnaire en python

Nous allons avoir une méthode qui permettrait de mettre en cache les résultats qu'il calcule.

"Si" approche:

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 = {}

"Sauf" approche:

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/a" approche:

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

Est-il une autre (plus rapide)? Celui qui est le plus pythonic? Laquelle aimeriez-vous utiliser?

Note: Il y a une différence de vitesse:

calculate = calculateX # depening on test run
for i in xrange(10000):
    calculate(datetime.utcnow())

Résultats time python test.py:

calculate1: 0m9.579s
calculate2: 0m0.130s
calculate3: 0m0.095s

source d'informationauteur Martin Tóth