[Débutants] Exemple de simplification de code (+ exemple poo)

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:32

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).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:33

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 ;
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:33

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.
ramled#1.png
ramled#1.png (56.18 Kio) Vu 4541 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:34

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 :
ramled#2.png
ramled#2.png (26.86 Kio) Vu 4541 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:35

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 :
Fichiers joints
ramled#3.png
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).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:36

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
ramled#4.png
ramled#4.png (24.3 Kio) Vu 4541 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:37

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.
ramled#5.png
ramled#5.png (23.81 Kio) Vu 4541 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:37

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’.
ramled#6.png
ramled#6.png (13.13 Kio) Vu 4540 fois
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).

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: [Débutants] Exemple de simplification de code

Message par Bud Spencer » mar. 30 juil. 2019 19:38

Ç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.
ramled#7.png
ramled#7.png (19.89 Kio) Vu 4541 fois
Ç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).

Frédéric
Messages : 17
Enregistré le : lun. 29 juil. 2019 19:47

Re: [Débutants] Exemple de simplification de code

Message par Frédéric » mar. 30 juil. 2019 20:17

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!!!

Répondre

Retourner vers « Python »