【问题标题】:Difference between Rscript and littlerRscript 和 littler 的区别
【发布时间】:2011-03-13 10:17:28
【问题描述】:

...除了 Rscript#!/usr/bin/env Rscript 调用和 littler 被 @987654323 调用的事实之外@(在我的系统上)在脚本文件的第一行。我发现执行速度存在某些差异(似乎 littler 有点慢)。

我创建了两个虚拟脚本,每个脚本运行 1000 次并比较平均执行时间。

这是 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)

这是较小的文件:

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

如您所见,它们几乎相同(第一行和接收器文件参数不同)。输出是sinked 到文本文件,因此在R 中用read.table 导入。我创建了 bash 脚本来执行每个脚本 1000 次,然后计算平均值。

这是 bash 脚本:

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

结果是:

# 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 

长话短说:除了(明显的)执行时间差异之外,还有其他差异吗?更重要的问题是:为什么你应该/不应该更喜欢 littler 而不是 Rscript(反之亦然)?

【问题讨论】:

  • +1 好问题;喜欢细节。
  • 感谢 Shane,数据文件在此处可用:bit.ly/ac0Fb1 请注意,我的机器非常慢,因此如果您决定运行这些脚本,则更有可能获得较低的值。像往常一样,Dirk 的出色答案引起了人们对这些基准脚本的其他问题的关注……所以请以这些结果 cum grano salis 为例。

标签: r scripting execution-time littler


【解决方案1】:

几个快速的cmets:

  1. /usr/local/bin/r 的路径是任意的,您可以使用/usr/bin/env r,就像我们在某些示例中所做的一样。我记得,它限制了你可以给r 的其他参数,因为当通过env 调用时它只需要一个参数

  2. 我不明白你的基准,以及你为什么要那样做。我们确实在来源中有时间比较,请参阅tests/timing.shtests/timing2.sh。也许您想在启动和图形创建或您所追求的任何东西之间拆分测试。

  3. 每当我们运行这些测试时,liter 都会获胜。 (当我现在重新运行它们时,它仍然获胜。)这对我们来说很有意义,因为如果您查看 Rscript.exe 的源代码,通过在最终调用 execv(cmd, av) 之前设置环境和命令字符串,它的工作方式会有所不同。 littler 可以启动得更快一些。

  4. 主要价格是便携性。 littler 的构建方式不会适用于 Windows。或者至少不容易。 OTOH,我们已经移植了 RInside,所以如果有人真的想...

  5. Littler 于 2006 年 9 月首次推出,而 Rscript 于 2007 年 4 月推出 R 2.5.0。

  6. Rscript 现在无处不在。这是一个很大的优势。

  7. 在我看来,命令行选项更适合 littler。

  8. 两者都使用 CRAN 包 getopt 和 optparse 进行选项解析。

所以这是个人喜好。我共同编写了 littler,在这方面学到了很多东西(例如,对于 RInside)并且仍然觉得它很有用——所以我每天使用它几十次。它驱动蔓越莓。它驱动 cran2deb。正如他们所说,您的里程可能会有所不同。

免责声明:litter 是我的项目之一。

后记:我会把测试写成

我会这样写

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

甚至

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

去除异常值。此外,您基本上只测量 I/O(打印和绘图),它们都将从 R 库中获得,所以我预计差别不大。

【讨论】:

  • Dirk,感谢您及时彻底的回答!由于您参与了这个项目(而且,是的,我在开始发帖之前就知道这一点),因此我非常焦虑地期待您的回应。广告 1:我使用 ArchLinux,我只得到 /usr/local/bin/rwhereis r。如果我把/usb/bin/env r 错误发生。广告 2:我会试一试。我知道 littler 应该执行得更快,而且我仍然对 littler 在创建图形时执行得更慢这一事实感到惊讶。广告3:我不明白,你从我的帖子中运行脚本,得到不同的结果?请你把它们贴出来好吗?
  • 你可以给我发邮件 :) Re 1:这里没有错误,确保你有正确的模式和一切。 Re 2:我的测试是关于每个不同变体的启动速度;一旦开始,我希望他们做同样的事情,因为他们都使用相同的底层 R。 Re 3:不,我没有使用你的脚本;我只是想表明应该使用system.time(expression) 而不是proc.time() 构造。
  • 好的,我将更改虚拟脚本(以它们的作者命名),看看会发生什么。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2012-11-27
  • 2013-08-07
  • 2011-10-20
相关资源
最近更新 更多