Feedback TP noté

Auteur·rice

Joseph Salmon, Tanguy Lefort

Objectifs de cette note
  • Mieux connaître les erreurs classiques en Python pour savoir comment les éviter.

Remarques générales

  • De manière logique, si une de vos fonctions en appelle une autre, il vaut mieux la placer avant dans un soucis de clarté qu’après son appel…

  • Une fois votre code fini, relancez le tout pour voir s’il fonctionne. Parfois vous avez des variables que vous avez renommées et qui ne sont plus définies, ou bien qui sont appelées mais définies plus tard dans le code. Cela peut être source d’erreurs…

  • ne pas coder en dure les tailles des problèmes dans les fonctions: si vous changez de problème, le code ne marchera plus. Ainsi, il vaut mieux éviter d’écrire:

    def gradient_descente(grad_f, x_init, gamma, eps, n_iter):
        x = np.reshape(x_init, (23, 1))

    La dernière ligne peut être simplement: x = np.reshape(x_init, (len(x_init), 1)) si besoin. Idéalement, éviter aussi l’étape reshape d’ailleurs…

  • Éviter la duplication de code, cela réduit le nombre de lignes et donc le nombre d’erreurs possibles. Par exemple:

    for k in range(len(Iter_lin)):
        X1.append(Iter_lin[k][0])
        Y1.append(Iter_lin[k][1])
    for k in range(len(Iter_adapt)):
        X2.append(Iter_adapt[k][0])
        Y2.append(Iter_adapt[k][1])
    for k in range(len(Iter_méthode_1)):
        X3.append(Iter_méthode_1[k][0])
        Y3.append(Iter_méthode_1[k][1])

    peut se réécrire:

    my_list = [(Iter_lin, X1, Y1), (Iter_adapt, X2, Y2), (Iter_méthode_1, X3, Y3)]
    for (Iter, X , Y) in my_list:
        X.append([x[0] for x in Iter])
        Y.append([x[1] for x in Iter])

pep8: amélioration de la lisibilité

  • écrire x = x_init et non pas x=x_init. Cependant pour les attributs optionnels, il faut supprimer les espaces autour du =, par exemple on écrit: plt.subplots(2, 1, sharex=True).

  • écrire descentegrad(grad_f1, x, 0.01, 1000, 0.01) et non pas descentegrad(grad_f1,x,0.01,1000,0.01)

numpy

  • la norme infinie s’obtient avec np.linalg.norm(g, ord=np.inf) et non np.linalg.norm(g) (qui est la norme euclidienne par défaut).

  • np.array([L[k] for k in range(len(L))]) est équivalent à np.array(L)

  • vectorisation des codes: pensez à éviter les boucles pour certains calculs longs. Cela est plus rapide et plus lisible. Par exemple

    for i in range(d): 
        res = res + x[i]**2

    est équivalent à:

    res = np.sum(x**2)

    si d est le nombre de composantes de x.

scipy