Coder simplement, efficacement avec TeXgraph

qui simplifient parfois la vie!

Coder simplement, efficacement avec TeXgraph

Messagepar Alphonse Capriani » 02 Juin 2019 19:04

L'objectif de ce post est de regrouper quelques astuces permettant d'optimiser son code source TeXgraph. Toutes ces astuces sont validées par le Boss, Mr Fradin himself.
La plupart de ces conseils pourront paraitre triviaux, mais nul n'est à l'abris de tomber dans ces petits pièges...

Les TeXgrammeurs confirmés pourront proposer leurs astuces dans la suite de ce fil et celles-ci seront par la suite validées (ou lamentablement moquées) par le patron qui les ajoutera dans ce post.
Les novices pourront quand à eux poser leur questions sur telle ou telle manière de coder telle ou telle chose ce qui permettra d'alimenter cette liste de bonnes pratiques.

  • Parcours de liste :
    À éviter (complexité en $O(n^2)$): for k from 1 to Nops(L) do z:=L[k], ... od, il vaut mieux écrire (complexité en $O(n)$):
    Code: Tout sélectionner
     k:=0, for z in L do Inc(k), ... od

    Si on n'a pas besoin de la valeur de l'indice $k, alors il suffit d'écrire:
    Code: Tout sélectionner
    for z in L do ... od

  • Parcours avec condition : lorsqu'il faut vérifier une condition sur chaque élément d'une liste avant de traiter celui-ci, on peut utiliser un if à l'intérieur d'un for : for z in L do if z<=4 then ... else ... fi od, mais on peut aussi utiliser une structure prévue pour ça :
    Code: Tout sélectionner
     for z in L andif z<=4 do ... else ... odfi

    la partie else étant facultative, il peut aussi avoir des elif.
  • Instruction break() : depuis la version test 1.988, on peut casser une boucle for avec la nouvelle instruction break() ce qui permet d'éviter de parcourir inutilement toute la liste; Exemple, recherche de la première occurrence du chiffre 4 dans une liste :
    Code: Tout sélectionner
     k := 0, for z in L Inc(k,1), if z=4 then break() fi od

  • Tester si une variable est vide :
    À éviter if not(nil(var)) then ... fi, il vaut mieux écrire :
    Code: Tout sélectionner
     if var<>Nil then ... fi

  • Incrémenter ou décrémenter une variable :
    À éviter k := k+x, il est plus efficace d'écrire
    Code: Tout sélectionner
     Inc(k, x)

    Dans le premier cas le contenu de $k$ est dupliqué, par dans le second cas ($k$ et $x$ peuvent être des listes !)
  • Dessiner plusieurs lignes polygonales de mêmes attributs (épaisseur, couleur, remplissage,...) :
    À éviter : Line(liste1), Line(liste2), ..., il vaut mieux utiliser
    Code: Tout sélectionner
     Line([liste1,jump,liste2,jump,...])

    Dans le deuxième cas, il y a un seul objet graphique qui est créé (une ligne à plusieurs composantes). Par exemple, plutôt que d'écrire :
    for $z in L do Line([z, z+bla, z+blabla]) od, il vaut mieux écrire :
    Code: Tout sélectionner
    Line( for $z in L do  z, z+bla, z+blabla, jump  od )

    Cela vaut aussi pour dessiner un ensemble de points de mêmes attributs (commande Dot())
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Coder simplement, efficacement avec TeXgraph

Messagepar Alphonse Capriani » 02 Juin 2019 19:05

Bonjour tout le monde.

J'initie ce fil pour pouvoir partager avec les utilisateurs quelques conseils simples permettant d'optimiser son code. Cette idée m'ai récemment venu à l'esprit quand en fouillant sur le forum je suis tombé sur le conseil 2. Cette subtilité m'a marqué car j'avais commis cette erreur dans la journée même. Je suis par la suite tombé sur un autre conseil dans un autre fil que je me suis permis d'ajouter ici.

Comme mentionné dans le premier post, il s'agira de conseils simples, souvent triviaux mais qui peuvent facilement devenir des pièges sournois. Il est possible que ces conseils figurent déjà dans la doc, mais sauf si on relit la doc de A à Z, il est difficle de retomber dessus quand on en a besoin.
L'idéal serait que Mr Fradin valide les propositions faites et alimente par conséquent le post initial. Bien sûr, s'il veut rajouter ses propres conseils, qu'il ne se gêne pas :D

J'ai aussi créé ce fil car comme je me suis remis à TeXgraph assez récemment, il y a pas mal de subtilités que j'ai oublié et je n'ai pas envie de reposer une ènième fois certaines questions et provoquer l'ire de notre chef !

Que pensez vous de cette démarche ? Le boss accepte-t-il cette nouvelle responsabilité ?

NB : j'ai ajouté une ligne vide au tableau pour simplifier la saisie de futures lignes. Je précise aussi que cette structure en tableau n'est peut-être pas la plus adaptée et peut donc être modifiée pour plus de lisibilité.
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Coder simplement, efficacement avec TeXgraph

Messagepar P.Fradin » 02 Juin 2019 20:58

Salut,

C'est une très bonne idée ! Je valide ce qui a déjà été dit, mais je garde un œil ouvert !
Je peux en profiter pour dire quelques mots en ce qui concerne les listes :

  • Dans TeXgraph de sont des "vraies" listes en ce sens que pour accéder à l'élément k il faut partir du premier et parcourir la liste jusqu'à l'indice k (contrairement à Python), et donc dans une boucle du type
    Code: Tout sélectionner
    for k from 1 to Nops(L) do z:=L[k], ... od

    la complexité est un $O(n^2)$ où $n$ est la longueur de la liste, alors que dans la boucle:
    Code: Tout sélectionner
    for z in L do ... od

    la complexité est un $O(n)$ (c'est pareil dans Maple), pour de grandes valeurs de $n$ la différence est très nette.
  • Parcours avec condition : lorsqu'il faut vérifier une condition sur chaque élément d'une liste avant de traiter celui-ci, on peut utiliser un if à l'intérieur d'un for : for z in L do if z<=4 then ... else ... fi od, mais on peut aussi utiliser une structure prévue pour ça :
    Code: Tout sélectionner
    for z in L andif z<=4 do ... else ... odfi

    la partie else étant facultative, il peut aussi avoir des elif.
  • Depuis la version test 1.988, on peut casser une boucle for avec la nouvelle instruction break() ce qui permet d'éviter de parcourir inutilement toute la liste; Exemple, recherche de la première occurrence du chiffre 4 dans une liste :
    Code: Tout sélectionner
    k := 0,
    for z in L Inc(k,1), if z=4 then break() fi od
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1902
Inscription: 29 Oct 2008 15:04

Re: Coder simplement, efficacement avec TeXgraph

Messagepar Alphonse Capriani » 03 Juin 2019 12:20

Bonjour Patrick !

Je constate avec ton précédent message que ta mise en forme des conseils est plus propre et plus lisible que celle que j'avais proposé (et aussi bien moins contraignante à saisir). Elle permet en plus d'ajouter des infos concernant ceux-ci.
Du coup, si tu es du même avis, je pense que tu peux faire le remplacement dans le post initial. (Le revers de la médaille est peut-être que le post initial risque de s'étendre un peu en longueur, mais je suis pas sûr que ce soit réellement un problème)

Deux nouvelles suggestions qui m'ont été faites il y a fort longtemps sur ce forum et qui me paraissent à l'heure actuelle évidente mais qui peuvent échapper aux débutants.

* La commande Inc(k, x) est plus efficace que k:=k+x (en tout cas, il me semble !)
* Pour l'affichage de plusieurs éléments de même type tels qu'un ensemble de points ou de lignes polygonales, préférer cette syntaxe :
Code: Tout sélectionner
Ligne(
   [liste1, jump, liste2, jump, ...]
)

plutôt que :
Code: Tout sélectionner
Ligne(liste1),
Ligne(liste2),
...

Ça peut paraître évident vu comme ça (d'autant que le code est plus court et peut-être plus lisible) mais cette remarque prend surtout son sens lorsque l'on utilise des structures de contrôle (piège dans lequel je suis tombé plus d'une fois). Voici un exemple :
Préferer :
Code: Tout sélectionner
Ligne(
  for $z in L do
    z, z+bla, z+blabla, jump
  od
)

à :
Code: Tout sélectionner
for $z in L do
  Ligne([z, z+bla, z+blabla])
od
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY

Re: Coder simplement, efficacement avec TeXgraph

Messagepar P.Fradin » 03 Juin 2019 18:38

Salut,

J'ai modifié ton post initial, en ajoutant ce qui a été dit depuis. On peut convenir que lorsqu'un truc est validé, je l'ajoute à ton premier post si tu es d'accord.
P.Fradin
Avatar de l’utilisateur
P.Fradin
Administrateur du site
 
Messages: 1902
Inscription: 29 Oct 2008 15:04

Re: Coder simplement, efficacement avec TeXgraph

Messagepar Alphonse Capriani » 03 Juin 2019 19:03

Oui oui, c'était l'idée ;)
Ya Ba Da Ba Dooo!!!
Avatar de l’utilisateur
Alphonse Capriani
 
Messages: 576
Inscription: 18 Juil 2009 19:10
Localisation: East Harlem - NY


Revenir vers Trucs et astuces

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités

cron