temps de calcul long

R et systèmes d'exploitation, configuration de R, gestion de la mémoire, construction des packages, interfaces entre R et d'autres logiciels, éditeurs pour R

Modérateur : Groupe des modérateurs

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

temps de calcul long

Messagepar hénin virginie » 29 Mai 2006, 11:54

bonjour je voudrais savoir comment on peut réduire le temps d'exécution d'un programme
faut il mieux utiliser une fonction que de donner le code brut
faire une fonction faisant appel à d'autres à l'intérieur qui pourrait remplacer une boucle
??

Samir Messad
Messages : 76
Enregistré le : 10 Jan 2005, 20:56

Messagepar Samir Messad » 29 Mai 2006, 17:25

Bonjour,

pour les boucles, dans la mesure du possible essayer d'utiliser des fonctions comme apply, lappy, sapply, mapply. Ce sera plus rapide que d'utiliser une boucle for par exemple. Vous pouvez mesurer le temps cpu de calcul d'une fonction avec la fonction system.time.

Cordialement.

Samir Messad

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 06:57

le problème c'est que je ne m'étrise pas très bien ces fonctions alors j'ai tendance à utiliser des boucles
est ce normal que si je lance une boucle de 1000 qui prend 5 minutes environ
la m^me bouclemais pour 10000 prenne plus de 8heures

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 30 Mai 2006, 07:12

Bonjour,
En effet le temps d'exécution n'est pas proportionnel au nombre d'itérations en raison du mécanisme de gestion de la mémoire. On peut gagner un temps considérable (10 à 100 fois plus rapide) en repérant les fonctions qui prennent du temps et en les programmant dans un langage compilé (C en particulier). L'idéal est de mettre le maximum de boucles dans ces fonctions. Il y a un exemple ici :
http://cran.r-project.org/doc/manuals/R-exts.html#System-and-foreign-language-interfaces
Cordialement.

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 07:27

je comprends pas trop comment faire avec C en plus je pense que je ne l'ai pas sur mon ordi
sinon si je te mets mon code crois tu que tu pourrais voir si on peut remplacer des bloucles par des apply???

Cordialement

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 30 Mai 2006, 07:53

je comprends pas trop comment faire avec C en plus je pense que je ne l'ai pas sur mon ordi

Ce n'est pas très compliqué s'il y a peu de paramètres à passer, mais mieux vaut avoir un peu l'habitude de C sinon on peut perdre plus de temps que ne prennent les boucles...
sinon si je te mets mon code crois tu que tu pourrais voir si on peut remplacer des bloucles par des apply???

Oui s'il n'est pas trop compliqué, mais sans garantie de résultat ni de délai !

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 07:57

ben j'ai pas vraiment l'habitude du C mais i tu pouvais jeter un coup d'oeil à mon programme et me dire si tu vois des amméliorations merci
beaucoup

voilà mon code alors ::

new_ponderation=function(chemin1,chemin2,chemin3)

{

#chemin1 : chemin permettant d'accéder au premier tableau de sortie de la BAO
#chemin2 : chemin permettant d'accéder aux tableaux rbao* de sortie de la BAO
#contient les données restructurées à l'aide de perl

#début de la fonction de vraisemblance

cat("Sur combien de campagnes porte l'analyse\n")
nbcamp<-scan(quiet=T,"",numeric(),1)
Nb_var=length(xvar)
cat("Sur combien d'échantillons calcule t'on la vraisemblance \n")
Nb_ech<-scan(quiet=T,"",numeric(),1)
tab_b=read.table(chemin1,sep=" ")
tab_b=cbind(as.factor(tab_b[,1]),tab_b[4:5],tab_b[7])
names(tab_b)=c("N_camp","N_var","nom_var","Kij")
Nb_param=length(xname)
print ("debut programme")
print(date())
sigma=matrix(0,Nb_var,Nb_ech)
somme_obs_predi=matrix(0,Nb_var,Nb_ech)
poids_simu=matrix(0,1,Nb_ech)
poids_log=matrix(0,1,Nb_ech)
#calcul du nombre d'observations par type de mesure
nt=0
for (i in 0:Nb_var-1)
{
nt[i+1]= sum(tab_b[tab_b$N_var==(i),4])
}
tab_nt=cbind(as.vector(tab_b$nom_var[1:Nb_var]),nt)

tab_var=list()

for (i in 1:Nb_var)
{
tab_var[[i]]=as.data.frame(matrix(data =scan(file=paste(chemin3,xvar[i],".txt",sep=""),what = numeric(0)),nrow=as.numeric(tab_nt[i,2])*Nb_ech, ncol = 3, byrow = TRUE))
}

for (e in 1:Nb_ech)
{
#calcul de la pondération pour un échantillon (correspond à une ligne du fichier .rbao


#calcul des sommes observés - prédits au carré
somme_obs_pred=matrix(0,1,Nb_var)
#tirage des 1/sigma^2
sigmaj=matrix(0,1,Nb_var)
poids_simu[e]=1
poids_log[e]=0
for (i in 1:Nb_var)
{ if (dim(tab_var[[i]])[[1]]!=0)
{
tab_var_inter=tab_var[[i]]
somme_obs_pred[i]=sum((tab_var_inter[tab_var_inter$V1 == e,][,2]- tab_var_inter[tab_var_inter$V1 == e,][,3])^2)
sigmaj[i]=rgamma(1,shape=as.numeric(tab_nt[i,2]),scale=2/as.numeric(somme_obs_pred[i]))
poids_log[e]=poids_log[e]+((as.numeric(tab_nt[i,2])/2+1)*log(2/as.numeric(somme_obs_pred[i])))
poids_simu[e]=poids_simu[e]*((2/as.numeric(somme_obs_pred[i]))^(as.numeric(tab_nt[i,2])/2+1))

}
else
{
somme_obs_pred[i]="NA"
sigmaj[i]="NA"
}
}
sigma[,e]=sigmaj
somme_obs_predi[,e]=somme_obs_pred
print (e)
}
param=as.data.frame(matrix(data =scan(file=paste(chemin3,"para.txt",sep=""),what = numeric(0)),nrow=Nb_ech, ncol = Nb_param, byrow = TRUE))
resul=list(poids_simu,param,sigma,somme_obs_predi,poids_log)
names(resul)=c("ponderation","param","sigma","somm_erreur","ponderation_log")
print ("fin programme")
print(date())
return(resul)
}

Cordialement

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Messagepar François Bonnot » 30 Mai 2006, 09:34

Il n'est pas facile de trouver ce qui prend du temps sans disposer des données ni des variables externes (par ex xvar). Les premières boucles n'ont pas l'air bien méchantes mais celle qui commence par "for (e in 1:Nb_ech)" semble redoutable si le produit Nb_ech*Nb_var est grand. Il y a peut-être (pour commencer) des améliorations à apporter dans la gestion des données. Par exemple tab_var est une liste de data frames, pourquoi ne pas laisser une liste de matrices? Il faut aussi essayer de repérer les instructions qui peuvent prendre du temps, par exemple dans

Code : Tout sélectionner

somme_obs_pred[i]=sum((tab_var_inter[tab_var_inter$V1 == e,][,2]- tab_var_inter[tab_var_inter$V1 == e,][,3])^2)
tab_var_inter$V1 == e est exécuté 2 fois et la sélection des lignes aussi. Peut-être que ce serait plus rapide (mais il faut essayer) d'écrire

Code : Tout sélectionner

tab_var_inter.e <- tab_var_inter[tab_var_inter$V1 == e,]
somme_obs_pred[i]=sum((tab_var_inter.e[,2]- tab_var_inter.e[,3])^2)
Il y a sûrement d'autres améliorations (en particulier transformer les for en apply) mais il faudrait disposer de tous les éléments et surtout y passer du temps.
Cordialement.

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 09:42

merci d'avoir regarder je vais essayer d'améliorer ça et je suis d'accord avec toi sur le fait que c'est cette boucle qui prend du temp
en tout cas merci
je vais essayer de me débrouiller


Cordialement

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 09:54

apparement ce qui prenait du temps c'était bien les data frame je les ai mis en matrice uniquement et là ça à l'air d'aller plus vite merci beaucoup je savais pas qui fallait préférer les matrices aux data frame
merci beaucoup

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 30 Mai 2006, 12:13

cependant le programme prend encore pas mal de temps
si jamais tu vois comment utiliser des apply dit le moi
j'essaie de voir mais comme j'ai pas l'habitude c'est dur

Romain François
Messages : 42
Enregistré le : 08 Déc 2005, 19:23
Contact :

Messagepar Romain François » 10 Juin 2006, 16:02

Bonjour,

Il est possible de savoir ce qui prends le plus de temps, avec les fonctions de profiling de R : voir ?Rprof

Code : Tout sélectionner

R> Rprof()
.... # tout ton code
R> Rprof(NULL)
R> summaryRprof()


Il y a eu un défi sur le wiki de R il y a quelque temps :
http://wiki.r-project.org/rwiki/doku.ph ... ode_optim2
Ca peut aider

Romain
--
Romain François
Consultant R Indépendant
http://romainfrancois.blog.free.fr

hénin virginie
Messages : 14
Enregistré le : 18 Avr 2006, 15:11

Messagepar hénin virginie » 12 Juin 2006, 15:16

j'ai posté un nouveau message dans conversion R et C si quelqu'un peu m'aider
merci
j'ai testé avec saplly et .by le temps de calcul est un peu plus long qu'avec ma version d'origine


Retourner vers « Archives : Environnement de R »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité