40 votes

Différence entre Rscript et littler

...outre le fait que Rscript est invoqué avec #!/usr/bin/env Rscript et littler avec #!/usr/local/bin/r (sur mon système) dans la première ligne du fichier de script. J'ai trouvé certaines différences dans la vitesse d'exécution (on dirait que littler est un peu plus lent).

J'ai créé deux factice scripts, couru chaque 1000 fois et par rapport à la moyenne de temps d'exécution.

Voici la Rscript fichier:

#!/usr/bin/env Rscript

btime <- proc.time()
x <- rnorm(100)
print(x)
print(plot(x))
etime <- proc.time()
tm <- etime - btime
sink(file = "rscript.r.out", append = TRUE)
cat(paste(tm[1:3], collapse = ";"), "\n")
sink()
print(tm)

et voici le littler fichier:

#!/usr/local/bin/r

btime <- proc.time()
x <- rnorm(100)
print(x)
print(plot(x))
etime <- proc.time()
tm <- etime - btime
sink(file = "little.r.out", append = TRUE)
cat(paste(tm[1:3], collapse = ";"), "\n")
sink()
print(tm)

Comme vous pouvez le voir, ils sont presque identiques (première ligne et lavabo fichier argument différent). La sortie est - sinked dans un fichier texte, donc importé dans R avec read.table. J'ai créé le script bash pour exécuter chaque script de 1000 fois, puis calculé les moyennes.

Voici script bash:

for i in `seq 1000`
do
./$1
echo "####################"
echo "Iteration #$i"
echo "####################"
done

Et les résultats sont les suivants:

# littler script
> mean(lit)
    user   system  elapsed 
0.489327 0.035458 0.588647 
> sapply(lit, median)
   L1    L2    L3 
0.490 0.036 0.609 
# Rscript
> mean(rsc)
    user   system  elapsed 
0.219334 0.008042 0.274017 
> sapply(rsc, median)
   R1    R2    R3 
0.220 0.007 0.258 

Longue histoire courte: à côté (évidente) de l'exécution de différence de temps, est-il une autre différence? La question importante est: pourquoi devrait/ne devrait pas vous préférez littler sur Rscript (ou vice versa)?

25voto

Dirk Eddelbuettel Points 134700

Quelques rapides commentaires:

  1. Le chemin de /usr/local/bin/r est arbitraire, vous pouvez utiliser /usr/bin/env r aussi bien que nous dans quelques exemples. Je me souviens, il les limites de ce que les autres arguments que vous pouvez donner à d' r comme un seul lorsqu'il est invoqué par env

  2. Je ne comprends pas votre référence, et pourquoi vous devriez faire de cette façon. Nous n' avons timing des comparaisons dans les sources, reportez - tests/timing.sh et tests/timing2.sh. Peut-être que vous souhaitez diviser le test entre le démarrage et le graphique de la création ou de ce que vous êtes après.

  3. Chaque fois que nous avons couru les tests, littler gagné. (Il ne veut toujours quand je re-couru à ceux-ci maintenant.) Ce qui fait sens pour nous, car si vous regardez les sources d' Rscript.exe, il fonctionne différent par la mise en place de l'environnement et une chaîne de commande avant de finalement l'appel de execv(cmd, av). littler peut commencer un peu plus rapide.

  4. Le prix principal est la portabilité. La façon littler est construit, il ne le fera pas pour Windows. Ou du moins pas facilement. Otoh, que nous avons RInside porté donc, si quelqu'un voulait vraiment...

  5. Littler est venu une première fois en septembre 2006 par rapport Rscript qui est venu avec R 2.5.0 en avril 2007.

  6. Rscript est maintenant partout où R est. Qui est un gros avantage.

  7. Options de ligne de commande sont un peu plus raisonnable pour littler, de mon point de vue.

  8. Les deux fonctionnent avec CRAN paquets getopt et optparse pour l'option de l'analyse.

Donc, c'est une question de préférence personnelle. J'ai co-écrit littler, appris beaucoup de choses à faire (par exemple pour RInside) et toujours trouver utile, j'ai donc utiliser des dizaines de fois chaque jour. Il entraîne les Canneberges. Il entraîne cran2deb. Votre kilométrage peut, en tant que hey dire, varier.

Avertissement: littler est l'un de mes projets.

Postscriptum: je l'ai écrit le test

J'aurais écrit ce que

  fun <- function { X <- rnorm(100); print(x); print(plot(x)) }
  replicate(N, system.time( fun )["elapsed"])

ou même

  mean( replicate(N, system.time(fun)["elapsed"]), trim=0.05)

pour se débarrasser de l de valeurs aberrantes. En outre, vous ne mesurent essentiellement les I/O (une impression, et une parcelle), qui tous deux se de la R de la bibliothèque donc je m'attends guère de différence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X