Valid XHTML     Valid CSS2    

Introduction à la programmation R (exercices)

Séance 8 : Déboggage, profilage et optimisation

                     gilles.hunault "at" univ-angers.fr

 

Table des matières cliquable

  1. Code lisible et debug

  2. Optimisation

  3. Vitesses d'exécution

  4. Positions du maximum et gestion de la mémoire

  5. Tris et "big data"

 
Il est possible d'afficher toutes les solutions via ?solutions=1 et de toutes les masquer avec via ?solutions=0.

 

1. Code lisible et debug

A-t-on besoin de la fonction debug() pour trouver pourquoi le code suivant ne fonctionne pas, sachant qu'on cherche à renvoyer la chaine de caractères passée en paramètre avec la lettre initiale en majuscule et toute le reste en minuscules ?


     iniMaju <- function(chaine) {
        return(paste(toupper(substr(chaine,0,1)),
           tolower(substr(chaine,1,nchar(chaine))),sep=""))}
     

Solution :  

 

2. Optimisation

On dispose d'une fonction mathématique f et on voudrait calculer sa valeur en n points répartis uniformément sur l'intervalle [a,b] à l'aide d'une boucle. On propose la formule suivante pour calculer la position de chacun des points xi, pour i de 1 à n, sachant que x1=a et xn=b :

                    non su

On veut par exemple tester ce calcul avec f(x)=x+1 sur l'intervalle [0,1] avec n=100 points.

Quel serait le code optimisé pour cette boucle ?

Peut-on effectuer le calcul sans boucle ?

Solution :  

 

3. Vitesses d'exécution

Peut-on vraiment affirmer que le code mot %in% vec est vraiment plus rapide que le code grep(mot,vec) ?

Et que any(v>0) est vraiment plus rapide que le code sum(v>0)>0 ?

Faut-il "sortir" les calculs dans les écritures des bornes des boucles ? Ainsi, faut-il écrire les boucles POUR et TANT QUE sous la forme


     lng <- length(v)
     pdv <- 1:lng
     
     for (ind in pdc) {
         traitement()
     } # fin pour ind
     
     ind <- 1
     while (ind<=lng) {
         traitement()
         ind <- ind + 1
     } # fin tant que
     

plutôt que de les écrire


     for (ind in 1:length(v)) {
         traitement()
     } # fin pour ind
     
     ind <- 1
     while (ind<=length(v)) {
         traitement()
         ind <- ind + 1
     } # fin tant que
     

Peut-on encore optimiser le code suivant qui calcule le maximum d'un vecteur, son nombre d'occurrences et toutes ses positions ?


     maxV <- max(V) # calcul une seule fois du maximum
     
     list( maximum=maxV          ,  # le maximum
           nbOcc=sum(V==maxV)    ,  # son nombre d'occurences
           lstOcc=which(V==maxV)    # toutes ses positions
     ) # fin de liste
     

Que faire si finalement R est lent, non dans les fonctions de base mais dans une fonction utilisateur ?

Solution :  

 

4. Positions du maximum et gestion de la mémoire

On veut trouver les 5 premières positions du maximum dans un très grand vecteur d'entiers. Est-ce un problème ?

Et si maintenant on veut stocker toutes les positions du maximum, comment faire sachant qu'il peut y avoir potentiellement très peu de positions ou au contraire un très grand nombre d'occurrences de ce maximum ?

Solution :  

 

5. Tris et "big data"

On dispose d'un fichier issu de la bioinformatique dont la taille est environ 4 Go.

Comment faire pour trier les lignes de ce fichier sachant que la mémoire de l'ordinateur est seulement de 2 Go et qu'on veut les cinq premières lignes triées ?

En fait, on ne s'intéresse qu'aux cinq lignes les plus longues de ce fichier. Faut-il le trier par ordre de taille de ligne et n'en garder que les cinq premières lignes ou peut-on écrire un algorithme plus efficace ?

Peut-on vraiment affirmer que le code sort(V,dec=TRUE) est vraiment plus rapide que le code rev(sort(V)) pour trier par ordre décroissant ?

Solution :  

 

 

Code-source php de cette page. Retour à la page principale du cours.

 

 

retour gH    Retour à la page principale de   (gH)