提高仿真性能-解析花费太多时间

巴特克塔努斯

我正在使用不同的概率分布和不同的参数进行一些模拟。示例:分配-正常,参数均值和sd。平均值是固定的(例如0),并且sd从1变为5。我编写了一些函数来处理这个简单的版本,如下所示:

test <- function(x, fixed, value, changed, seq){
    expr <- eval(parse(text=stri_flatten(c(fixed,"=",value))))
    for(i in seq_along(seq)){
        expr2 <- eval(parse(text=stri_flatten(c(changed,"=",seq[i]))))
        y <- dnorm(x, expr, expr2)
        sqrt(y*y + y*y)
    }
}

在我的函数中,解析花费了一半的仿真时间(25秒中的13秒)。我需要改善这一点,您知道怎么做吗?您可以运行Rprof函数并检查结果:

{Rprof();test(-10:10,"mean",0,"sd",seq(1,5,length.out = 1001));Rprof(NULL);}
summaryRprof()

我的Rprof模拟结果(仅一部分)

summaryRprof()
$by.self
                       self.time self.pct total.time total.pct
"parse"                    13.48    53.71      15.42     61.43
"ifelse"                    2.26     9.00      23.64     94.18
"structure"                 1.56     6.22       2.66     10.60
".External"                 0.80     3.19      17.90     71.31
"$<-"                       0.54     2.15       0.54      2.15
"options"                   0.52     2.07       0.54      2.15
"makeRestartList"           0.50     1.99       1.98      7.89
"c"                         0.46     1.83       0.46      1.83
"match"                     0.40     1.59       0.40      1.59
"doWithOneRestart"          0.38     1.51       1.60      6.37
"eval"                      0.32     1.27      15.84     63.11
"stopifnot"                 0.26     1.04       0.34      1.35
".Call"                     0.26     1.04       0.28      1.12
"phirsch"                   0.24     0.96      24.46     97.45
"t"                         0.24     0.96       0.26      1.04
"any"                       0.24     0.96       0.24      0.96
"pbeta"                     0.22     0.88      22.00     87.65
"list"                      0.20     0.80       0.20      0.80
"%in%"                      0.16     0.64       0.38      1.51
"^"                         0.14     0.56       0.14      0.56
"floor"                     0.14     0.56       0.14      0.56

加快此速度的一种方法是使用内部解析功能:

text <- "a <- 5"
internalParse <- function(x) .Internal(parse(stdin(), NULL, x, NULL, NULL, "unknown"))
microbenchmark(parse(text=text), internalParse(text))
## Unit: microseconds
##                 expr     min       lq  median       uq       max neval
##   parse(text = text) 146.388 196.4995 254.677 333.5975 11487.912   100
##  internalParse(text)  75.639  96.5910 115.239 135.3885  5031.508   100
本·博克(Ben Bolker)

怎么样

test2 <- function(x, fixed, value, changed, seqvec){
    argList0 <- setNames(list(value),fixed)
    for(i in seq_along(seqvec)){
        argList <- c(list(x),argList0,setNames(list(seqvec[i]),changed))
        y <- do.call(dnorm,argList)
        sqrt(y*y + y*y)
    }
}

(调用数字向量可能不是一个好主意seq:它在大多数情况下都可以使用,但是当它失败时,它将以一种非常混乱的方式失​​败!)

基准测试:

microbenchmark(test(-10:10,"mean",0,"sd",seq(1,5,length.out = 1001)),test2(-10:10,"mean",0,"sd",seq(1,5,length.out = 1001)),times = 10)
Unit: milliseconds
       expr       min        lq    median        uq       max neval
  test(...) 638.06613 643.23257 663.01249 682.08094 740.33703    10
 test2(...)  21.71302  22.07522  23.23993  28.96877  30.46197    10

我认为

outer(-10:10,1:5,dnorm,mean=0)

应该快,但它不是完全清楚你实际上要怎样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

提高仿真性能-解析花费太多时间

来自分类Dev

C#(.NET),如何修复Web响应性能,花费了太多时间

来自分类Dev

性能报告。两次或更多需要花费太多时间的条目

来自分类Dev

如何在不影响仿真性能的情况下检查绝对时间终止过程的约束?

来自分类Dev

代码花费太多时间

来自分类Dev

代码花费太多时间

来自分类Dev

仿真性能:x86与ARM

来自分类Dev

ExecutorFramework在性能测试中花费了很多时间?

来自分类Dev

创建AsyncTask花费太多时间Android

来自分类Dev

截断语句花费太多时间

来自分类Dev

JTextArea setText(veryLongString)花费太多时间

来自分类Dev

复杂的查询花费太多时间

来自分类Dev

截断花费太多时间hsqldb

来自分类Dev

Ajax花费太多时间进行加载

来自分类Dev

Sphinx查询花费太多时间

来自分类Dev

点燃缓存/查询花费太多时间

来自分类Dev

Ubuntu 12.04安装花费太多时间

来自分类Dev

查询花费太多时间。需要帮助

来自分类Dev

MySql“准备”花费太多时间

来自分类Dev

MySQL花费太多时间执行

来自分类Dev

Mongodb花费太多时间查找记录

来自分类Dev

Mysql 查询花费太多时间

来自分类Dev

groupby 数据框花费太多时间

来自分类Dev

Android中的synthesizeToFile时,TextToSpeech花费太多时间

来自分类Dev

PostgreSQL查询未执行或花费太多时间

来自分类Dev

MongoDB bulk.execute()花费太多时间插入无序

来自分类Dev

Java Applet花费太多时间来加载

来自分类Dev

从情节提要中加载View Controller花费太多时间

来自分类Dev

Android GPS花费太多时间来获取位置坐标