Examiner le temps d'exécution

Rédiger du code Python efficace

Logan Thomas

Scientific Software Technical Trainer, Enthought

Pourquoi chronométrer le code ?

  • Permet de choisir la méthode de code optimale
  • Code plus rapide == code plus efficace !
Rédiger du code Python efficace

Comment chronométrer le code ?

  • Calculer le temps d'exécution avec la commande magique IPython %timeit

  • Commandes magiques : améliorations par-dessus la syntaxe Python normale

    • Préfixées par le caractère « % »
    • Lien vers la doc (ici)
    • Voir toutes les commandes magiques avec %lsmagic
Rédiger du code Python efficace

Utiliser %timeit

Code à chronométrer

import numpy as np

rand_nums = np.random.rand(1000)

Chronométrer avec %timeit

%timeit rand_nums = np.random.rand(1000)
8.61 µs ± 69.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Rédiger du code Python efficace

Sortie de %timeit

alt="Sortie de la commande magique timeit"

Rédiger du code Python efficace

Sortie de %timeit

alt="Sortie de timeit avec la moyenne et l'écart type en surbrillance"

Rédiger du code Python efficace

Sortie de %timeit

alt="Sortie de timeit avec le nombre d'exécutions et de boucles en surbrillance"

Rédiger du code Python efficace

Spécifier le nombre d'exécutions/boucles

Définir le nombre d'exécutions (-r) et/ou de boucles (-n)

# Fixer le nombre d'exécutions à 2 (-r2)
# Fixer le nombre de boucles à 10 (-n10)

%timeit -r2 -n10 rand_nums = np.random.rand(1000)
16.9 µs ± 5.14 µs per loop (mean ± std. dev. of 2 runs, 10 loops each)
Rédiger du code Python efficace

Utiliser %timeit en mode « line magic »

Commande magique de ligne (%timeit)

# Une seule ligne de code

%timeit nums = [x for x in range(10)]
914 ns ± 7.33 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Rédiger du code Python efficace

Utiliser %timeit en mode « cell magic »

Commande magique de cellule (%%timeit)

# Plusieurs lignes de code

%%timeit
nums = []
for x in range(10):
    nums.append(x)
1.17 µs ± 3.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Rédiger du code Python efficace

Enregistrer la sortie

Enregistrer la sortie dans une variable (-o)

times = %timeit -o rand_nums = np.random.rand(1000)
8.69 µs ± 91.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Rédiger du code Python efficace
times.timings
[8.697893059998023e-06,
 8.651204760008113e-06,
 8.634270530001232e-06,
 8.66847825998775e-06,
 8.619398139999247e-06,
 8.902550710008654e-06,
 8.633500570012985e-06]
times.best
8.619398139999247e-06
times.worst
8.902550710008654e-06
Rédiger du code Python efficace

Comparer les temps

Les structures de données Python peuvent être créées avec le nom formel

formal_list = list()
formal_dict = dict()
formal_tuple = tuple()

Les structures de données Python peuvent être créées avec la syntaxe littérale

literal_list = []
literal_dict = {}
literal_tuple = ()
Rédiger du code Python efficace
f_time = %timeit -o formal_dict = dict()
145 ns ± 1.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
l_time = %timeit -o literal_dict = {}
93.3 ns ± 1.88 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
diff = (f_time.average - l_time.average) * (10**9)
print('l_time better than f_time by {} ns'.format(diff))
l_time better than f_time by 51.90819192857814 ns
Rédiger du code Python efficace

Comparer les temps

%timeit formal_dict = dict()
145 ns ± 1.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit literal_dict = {}
93.3 ns ± 1.88 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
Rédiger du code Python efficace

Prêt pour la course !

Rédiger du code Python efficace

Preparing Video For Download...