Python Language Avant de sauter avec une fonction gourmande en processeurs


Exemple

Un programme peut facilement perdre du temps en appelant plusieurs fois une fonction gourmande en processeurs.

Par exemple, prenez une fonction qui ressemble à ceci: elle retourne un entier si la value entrée peut en produire une, sinon None :

def intensive_f(value): # int -> Optional[int]
   # complex, and time-consuming code
   if process_has_failed:
       return None
   return integer_output

Et il pourrait être utilisé de la manière suivante:

x = 5
if intensive_f(x) is not None:
    print(intensive_f(x) / 2)
else:
    print(x, "could not be processed")

print(x)

Bien que cela fonctionne, il a pour problème d'appeler intensive_f , ce qui double la durée d'exécution du code. Une meilleure solution serait d'obtenir la valeur de retour de la fonction au préalable.

x = 5
result = intensive_f(x)
if result is not None:
    print(result / 2)
else:
    print(x, "could not be processed")

Cependant, une manière plus claire et peut - être plus pythonique consiste à utiliser des exceptions, par exemple:

x = 5
try:
    print(intensive_f(x) / 2)
except TypeError: # The exception raised if None + 1 is attempted
    print(x, "could not be processed")

Ici, aucune variable temporaire n'est nécessaire. Il est souvent préférable d'utiliser une instruction assert et d'attraper l' AssertionError place.

Clés de dictionnaire

Un exemple courant de l'endroit où cela se trouve est l'accès aux clés du dictionnaire. Par exemple comparer:

bird_speeds = get_very_long_dictionary()

if "european swallow" in bird_speeds:
    speed = bird_speeds["european swallow"]
else:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

avec:

bird_speeds = get_very_long_dictionary()

try:
    speed = bird_speeds["european swallow"]
except KeyError:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

Le premier exemple doit parcourir le dictionnaire deux fois, et comme il s'agit d'un long dictionnaire, cela peut prendre beaucoup de temps à chaque fois. La seconde ne nécessite qu'une seule recherche dans le dictionnaire, ce qui économise beaucoup de temps processeur.

Une alternative à ceci est d'utiliser dict.get(key, default) , cependant de nombreuses circonstances peuvent nécessiter des opérations plus complexes dans le cas où la clé n'est pas présente.