[Débutants] Exemple de simplification de code (+ exemple poo)
Modérateurs : Francois, Manfraid
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Non ! Le but n’est pas de faire le plus court possible mais de partir d’un code de débutant et de l’amener à le penser différemment pour le rendre plus efficace avec le moins de code possible mais sans utiliser d’autres instructions que celles qu’il connait et qu'il a utilisé. Tu penses bien que si j’avais voulu faire un code au plus court je l’aurais fait dès le début sans me farcir une page complète de code avec les différentes étapes de réduction.
Modifié en dernier par Bud Spencer le mar. 30 juil. 2019 19:47, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Petite aparté sur l’utilisation des opérateurs ternaires pour Frédéric (et les autres)
L’utilisation des opérateurs ternaires est une façon de simplifier l’écriture quand on a juste besoin de faire une (ou plusieurs) évaluation(s) pour attribuer une valeur à une variable ou une propriété. Avec ce type d’operateur on peut le faire de façon plus compacte et sur une seule ligne. Dans la plupart des langages courant (c, c++, java, c#, php, javasript, et bien d’autres …) la syntaxe est beaucoup plus compact mais un peu trop barbare pour être lisible pour un débutant mais en python ça reste visuellement très explicite et c’est pour ça que je la propose ici.
Exemple avec bloc ‘if else’ basic :
IF a > b THEN c = d ELSE c = e
Avec un opérateur ternaire en Python ca donne :
c = d if a > b else e
Dans la plupart des autres langages ce serait :
c = a > b ? d : e ;
L’utilisation des opérateurs ternaires est une façon de simplifier l’écriture quand on a juste besoin de faire une (ou plusieurs) évaluation(s) pour attribuer une valeur à une variable ou une propriété. Avec ce type d’operateur on peut le faire de façon plus compacte et sur une seule ligne. Dans la plupart des langages courant (c, c++, java, c#, php, javasript, et bien d’autres …) la syntaxe est beaucoup plus compact mais un peu trop barbare pour être lisible pour un débutant mais en python ça reste visuellement très explicite et c’est pour ça que je la propose ici.
Exemple avec bloc ‘if else’ basic :
IF a > b THEN c = d ELSE c = e
Avec un opérateur ternaire en Python ca donne :
c = d if a > b else e
Dans la plupart des autres langages ce serait :
c = a > b ? d : e ;
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Passons aux leds de ram. Comme précédemment, voilà le code original ou cette fois ci j’ai viré le code qui concerne les leds d’usage cpu pour y voir plus clair.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Finalement, c’est exactement le même principe que pour les leds de cpu, donc on peut aller directement au même niveau de simplification, ce qui donne :
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Attaquons maintenant la partie arithmétique.
La première chose que l’on remarque, c‘est que l’opération ‘1024 * 1024 * X * totalRam’ est présente 9 fois dans le code de la boucle, donc autant placer la valeur statique de l’opération dans une variable dès le début. J’appelle cette variable ‘coef’ et surtout, je l’initialise dans la partie déclarative. Non seulement on réduit la taille du code mais surtout on fait l’économie de 9 x 2 multiplications inutile à chaque tour de boucle :
La première chose que l’on remarque, c‘est que l’opération ‘1024 * 1024 * X * totalRam’ est présente 9 fois dans le code de la boucle, donc autant placer la valeur statique de l’opération dans une variable dès le début. J’appelle cette variable ‘coef’ et surtout, je l’initialise dans la partie déclarative. Non seulement on réduit la taille du code mais surtout on fait l’économie de 9 x 2 multiplications inutile à chaque tour de boucle :
- Fichiers joints
-
- ramled#3.png (26.02 Kio) Vu 4541 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Maintenant, si on raisonne de façon simpliste, le but recherché c’est toujours d’allumer une led en relation avec un pourcentage au pas de 20%, comme pour l’usage cpu. Utilisons donc des % plutôt que des valeurs recalculées à chaque évaluation. D‘après le code original de Fredéric et de ses valeurs à lui, la valeur maximale de ram est égale à : 1024 * 1024 * 1025 * memoireDuPiEnGo. La mémoire disponible est obtenu par ram.availlable de la librairie psutil. On peut donc facilement transformer ramFree en pourcentage et simplifier grandement les évaluations qui déterminent l’état des leds
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Puis corriger les petites anomalies et réordonner le code pour arriver exactement au même code que pour les led cpu. La seule chose qui change c’est bien évidement les n° de GPIO et la variable de valeur utilisée.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
On pourrait se dire que l’on est au bout de la simplification ‘basic’ pour les leds de ram mais on peut encore faire mieux. Pour déterminer les seuils des leds de ram, Frederic détermine une valeur de ram total (1024 * 1024 * 1025 * MemoireDuPiEnGo) et la met en relation avec la propriété ‘available’ retourné par la fonction virtual_memory() de la librairie psutil. Si on regarde un peu la doc de psutil, on peut voir que virtual_memory() retourne bien ‘available’, mais aussi ‘total’ et même ‘percent’.
Modifié en dernier par Bud Spencer le mar. 30 juil. 2019 19:51, modifié 1 fois.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
-
- Raspinaute
- Messages : 1089
- Enregistré le : lun. 15 août 2016 21:38
Re: [Débutants] Exemple de simplification de code
Ça veut dire que l’on n’a même pas besoin de définir la quantité de ram du pi dans le code et que l’on peut même utiliser la propriété percent pour s’affranchir des calculs de conversion. Cette propriété ‘percent’ représente la mémoire utilisée alors que nous on veut la mémoire dispo, qu’a cela ne tienne, il suffit simplement de faire 'ramFree = 100 – ram.percent' que l’on peut condenser en une seule instruction pour s’éviter la variable ram et on a directement le pourcentage de mémoire dispo dans ramFree. Les variables coef et totalRam n’ont plus raison d’être donc on peut les supprimer.
Ça commence à être vachement plus lisible vous ne trouvez pas ?
Et si on fait le compte, le code original faisait 27 multiplications par tour de boucle. Désormais on se contente d’une seule soustraction.
Prochaine étape, la sortie 'propre' du programme.
Ça commence à être vachement plus lisible vous ne trouvez pas ?
Et si on fait le compte, le code original faisait 27 multiplications par tour de boucle. Désormais on se contente d’une seule soustraction.
Prochaine étape, la sortie 'propre' du programme.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).
Re: [Débutants] Exemple de simplification de code
Alors là je suis impressionné! C est un super tuto, bien expliqué, bien détaillé et le codage est intelligent, utilisant en prime la doc de psutil (ca m apprendra a lire la doc ). Pour ce qui est des ternaires, je crois que sous c# c est moins lisible que avec python, ce qui m avait refroidis a l époque ou j apprenais le c# (quoique plus haut niveau que c). C est vrai que le but de ce tuto n est pas de faire "le plus cout possible" mais bien d enmenner un debutant, comme moi, entre autre, a avoir une reflexion de developpeur et donc d utiliser tous les outils disponibles, comme limiter les lignes inutiles, utiliser tous les outils disponibles (doc, arithmétiques, etc). Je crois que le but est atteint.
Ps: si je met 10 min pour ecrire 10 lignes de codes, vaut il mieux pour moi que j ecrive 40 lignes sans reflexion où reflechir 5~10 min et ecrire seulement 20 lignes de code...
Merci, super boulot Bud!!!
Ps: si je met 10 min pour ecrire 10 lignes de codes, vaut il mieux pour moi que j ecrive 40 lignes sans reflexion où reflechir 5~10 min et ecrire seulement 20 lignes de code...
Merci, super boulot Bud!!!