Oct. 27, 2021, 11:45 a.m., by Lem

Faire plusieurs appels à une fonction longue en R

Question

Petit point rapide pour répondre à une interrogation qui m'a été faite : pour une fonction en R lente, inamovible et non optimisable, est-ce que changer la boucle qui appelle la fonction permettrait d'optimiser le temps de calcul ? Par exemple en utilisant un autre langage plus bas niveau.

Étude

Il me semblait que la différence ne serait pas flagrante mais je voulais vérifier ce que ça donnait quantitativement, en prenant un cas pratique avec un même script interne en R et en le mobilisant via R, Python, et un script shell simple puis parallélisé.

Script R interne(prend une seconde environ sur ma machine):

# HEAVY
launchHeavy <- function() {
v = seq(1,10^6)
for (i in seq(20)) {
v = v**1.2
}
}

Et par exemple (au hasard (non)) le script shell qui lance les fonctions en tâche de fond :

v=0
vL=20
start=$SECONDS
while [ $v -lt $vL ]
do
Rscript Mono.r &
v=$((v+1));
done
wait
duration=$(( SECONDS - start ))
echo "DURATION:"$duration


Réponse

Résultats pour chaque langage de script (liés à la machine) :

Nombre d'itérations \ WrapperRPythonShSh &
10.824491 s0.901 s~1 s~1 s
2015.4029 s17.764 s~17 s~5 s

L'utilisation des capacités de lancement dans des processus du script shell avec le suffixe "&" (associable avec le mot-clé "wait"*) est la seule façon parmi celles listées pour réellement compresser le temps de calcul.

* "wait" placé après des processus en tâche de fond permet d'attendre que chaque processus soit terminé avant de poursuivre le script

> More Infotips articles

Add a comment

| RSS feed for all notifications | for dev news only