IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Optimisation boucle R


Sujet :

R

  1. #1
    Membre expérimenté
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Par défaut Optimisation boucle R
    Bonjour,

    Je souhaite optimiser cette boucle ou avoir une fonction R qui pourra faciliter le calcul. La boucle tourne encore au bout de 15min.

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    #Coef_final2 est une data.frame
    for ( i in 1:32604){ 
      for ( j in 1:52)
      coef_final2[i, j+2] = coef_final1[i,j+1]*coef_final1[i,j+55]
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     for ( j in 1:52) coef_final2[, j+2] = coef_final1[,j+1]*coef_final1[,j+55]
    Ca devrais pas mal accélérer déjà, même s'il y a surement plus opti.

  3. #3
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    Si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coef_final2[, 3:54] <- coef_final1[, 2:53]*coef_final1[, 56:107]
    Cdlt

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    @tototode: ta fonction ne fait pas la même chose. Dans le code d'origine, la valeur en j+2 dépends de la valeur en j+1 donc il faut forcément utiliser une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > a=as.numeric(1:107)
    >  for ( j in 1:52 ) a[j+2] = a[j+1]*a[j+55]
    > head(a)
    [1]        1        2      112     6384   370272 21846048
    > b=as.numeric(1:107)
    > b[3:54] <- b[2:53]*b[56:107]
    > head(b)
    [1]   1   2 112 171 232 295

  5. #5
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    @Theta : ça aurait été vrai si l'objet de stockage était le même que l'objet sur lequel se fait l'opération mais ici ce n'est pas le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    coef_final1 <- as.data.frame(matrix(NA, 32604, 107))
    tab <- as.data.frame(matrix(rpois(32604*104, 5), 32604))
    coef_final1[c((1:52)+1, (1:52)+55)] <- tab
     
    coef_final2 <- as.data.frame(matrix(NA, 32604, 54))
    coef_final3 <- coef_final2 
     
    for ( j in 1:52) coef_final2[, j+2] = coef_final1[,j+1]*coef_final1[,j+55]
     
    coef_final3[, 3:54] <- coef_final1[, 2:53]*coef_final1[, 56:107]
     
    all.equal(coef_final2, coef_final3)
    [1] TRUE
    cdlt

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    Ha oui j'avais pas vu qu'il y avait deux objets.
    Ta version est donc la plus performante.

  7. #7
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Sur cet exemple, la différence entre les versions avec et sans boucle n'est pas flagrante, mais il est préférable de prendre des bonnes habitudes et de vectoriser au maximum les calculs.

    cdlt

  8. #8
    Membre expérimenté
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Par défaut
    Merci à vous, ne pas boucler sur les lignes à accélérer le calcul.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Optimisation boucle while pour envoi d'e-mails
    Par renaud26 dans le forum Langage
    Réponses: 1
    Dernier message: 18/02/2010, 08h22
  2. Optimisation boucle for
    Par kwatz dans le forum MATLAB
    Réponses: 10
    Dernier message: 03/03/2009, 08h48
  3. Optimiser boucles de boucles (comparer de i en i)
    Par blaame dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 08/04/2008, 20h54
  4. optimisation boucle
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 23/10/2007, 16h43
  5. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo