Różnica między Rscript i littler

...poza tym, że Rscript jest wywoływany przez #!/usr/bin/env Rscript i littler z #!/usr/local/bin/r (w moim systemie) w pierwszej linii pliku skryptu. Znalazłem pewne różnice w szybkości wykonania (wygląda na to, że littler jest nieco wolniejszy).

Stworzyłem dwa atrapy skryptów, uruchomiłem każdy 1000 razy i porównałem średni czas wykonania.

Oto plik Rscript:

#!/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)

A oto mały plik:

#!/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)

As you can widzisz, są one prawie identyczne (pierwszy argument linii i sink file różnią się). Wyjście to sinked do pliku tekstowego, stąd importowane w R z read.table. Stworzyłem skrypt bash, aby wykonać każdy skrypt 1000 razy, a następnie obliczone średnie.

Oto skrypt Basha:

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

A wyniki są następujące:

# 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 

W skrócie: poza (oczywistą) różnicą czasu wykonania, czy jest jakaś inna różnica? Ważniejsze pytanie brzmi: dlaczego powinieneś / nie powinieneś woleć littler nad Rscript (lub odwrotnie)?

Author: aL3xa, 2010-07-08

1 answers

Kilka szybkich komentarzy:

  1. Ścieżka {[2] } jest dowolna, możesz użyć /usr/bin/env r tak samo jak w niektórych przykładach. Z tego co pamiętam, ogranicza to, jakie inne argumenty możesz podać r, ponieważ wymaga tylko jednego wywołania przez env

  2. Nie rozumiem twojego punktu odniesienia i dlaczego to robisz w ten sposób. Mamy porównania czasowe w źródłach, zobacz tests/timing.sh i tests/timing2.sh. Może chcesz podzielić test na Start i tworzenie wykresów lub cokolwiek innego jesteś po.

  3. Za każdym razem, gdy przeprowadzaliśmy te testy, littler wygrywał. (Nadal wygrał, gdy ponownie uruchomiłem je teraz.), Co miało dla nas sens, ponieważ jeśli spojrzymy na źródła Rscript.exe, działa to inaczej, ustawiając środowisko i ciąg poleceń przed wywołaniem execv(cmd, av). littler może zacząć trochę szybciej.

  4. Główną ceną jest przenośność. Sposób, w jaki littler jest zbudowany, nie dotrze do Windows. A przynajmniej nie łatwo. Otoh mamy RInside ported więc jeśli ktoś naprawdę chciał...

  5. Littler pojawił się pierwszy we wrześniu 2006 roku w porównaniu z Rscript, który pojawił się z R 2.5.0 w kwietniu 2007 roku.

  6. Rscript jest teraz wszędzie tam, gdzie jest R. To duża zaleta.

  7. Opcje wiersza poleceń są moim zdaniem trochę bardziej sensowne dla littlera.

  8. Oba działają z pakietami Cran getopt i optparse do parsowania opcji.

Więc to osobiste preferencje. Współtworzyłem littler, dużo się nauczyłem robiąc to (np. dla RInside) i nadal uważam to za przydatne - więc używam go dziesiątki razy dziennie. Napędza żurawinę. Napędza cran2deb. Twój przebieg może się różnić.

Zastrzeżenie: littler jest jednym z moich projektów.

Postscriptum : napisałbym test jako

Napisałbym to jako

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

Lub nawet

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

Aby pozbyć się odstających. Co więcej, zasadniczo mierzysz tylko I/O (druk, i działki), które obie dostaną się z biblioteki R, więc spodziewałbym się małej różnicy.

 20
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-01 20:15:01