Pour réaliser des calculs basés sur des modèles scientifiques par l’intermédiaire d’outils numériques, il existe plusieurs possibilités :
- le calcul itératif, basé sur l’utilisation de boucles
- le calcul matriciel
Dans les exemples suivants, nous allons voir l’intérêt de passer en calcul matriciel notamment en terme de temps de calcul.
Cas des vecteurs
Pour cet exemple, nous allons nous baser sur les vecteurs suivants :
import numpy as np v_time = np.linspace(0,1,4000) f0 = 100 v_signal = np.sin(2 * np.pi * f0 * v_time)
Ce code génère deux vecteurs v_time et v_signal de 4000 échantillons chacun.
Par le suite, on va chercher à copier une partie des données (les 400 premiers échantillons) vers un autre vecteur.
n_max = 400 v_time_imp = np.zeros(n_max) v_time_mat = np.zeros(n_max)
On définit alors deux nouveaux vecteurs de 400 éléments remplis de 0.
Afin de pouvoir mesurer le temps d’exécution des programmes réalisés, nous allons nous appuyer sur la bibliothèque time de Python. Afin de pouvoir mesurer des temps faibles d’exécution, nous allons réaliser l’opération un certains nombres de fois.
Calcul itératif
On réalise ici l’opération 100 fois.
import time start1 = time.time() for k in range(100): for i in range(n_max): v_time_imp[i] = v_time[i] end1 = time.time() elapsed1 = end1 - start1 print(f'Temps d\'exécution (100 exécutions) : {elapsed1:.8}ms')
Calcul matriciel
On réalise ici l’opération 10 000 fois.
start2 = time.time() for k in range(int(1e4)): v_time_mat[0:n_max] = v_time[0:n_max] end2 = time.time() elapsed2 = end2 - start2 print(f'Temps d\'exécution (10^4 executions) : {elapsed2:.8}ms')
Comparaison
Les deux codes précédents fournissent le résultat suivant (avec un processeur Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz, 32 Go de RAM et sous Windows 10) :
Temps d'exécution (100 exécutions) : 0.0079784393ms Temps d'exécution (10^4 executions) : 0.0069489479ms
On s’aperçoit sur cet exemple simple que le calcul matriciel est environ 100 fois plus performant en terme de temps de calcul (100 exécutions pour le calcul itératif contre 10 000 exécutions pour le calcul matriciel donnant un temps d’exécution entre 7 et 8 us).