懒散,懒惰评价的奇怪行为?

时间:2014-04-29 14:22:13

标签: r lazy-evaluation lapply

有人能解释我这里发生了什么吗? 我有一个列表需要与表匹配,我正在使用 lapply fmatch (包fastmatch http://cran.r-project.org/web/packages/fastmatch/index.html)(我与匹配)相比,通过哈希表匹配使用匹配 但是,如果必须在函数中评估表值(至少这是我怀疑的那样),这是相当慢的,但我不完全确定。
我找到了一种解决方法,可以将计算速度从5.5加速到0.01秒,但是想要更优雅的解决方案 这是一个可重复的例子:

set.seed(10)

matchFeatures <- replicate(n = 1000, paste0("a", sample(x = 1:10000, size = sample(x = 1:10, size = 1))))
matchTable <- 1:10000

system.time(m1 <- lapply(matchFeatures, function(features) fmatch(features, paste0("a", 1:10000))))
system.time(m2 <- lapply(matchFeatures, function(features) force(fmatch(features, paste0("a", 1:10000)))))
system.time({tempTable <- paste0("a", 1:10000); m3 <- lapply(matchFeatures, function(features) fmatch(features, tempTable))})
identical(m1, m3)

感谢Justin,为了跟进,我正在寻找这样的事情:

system.time(m4 <- lapply(matchFeatures, fmatch, table = paste0("a", 1:10000)))

1 个答案:

答案 0 :(得分:2)

在前两个函数中,每次迭代都会运行paste命令一次(即10000次)。在第三种情况下,它只发生一次。如果您使用matchTable <- paste('a', 1:10000)并将matchTable传递给所有三个版本,则可以获得预期的大幅提升。

matchFeatures <- replicate(n = 1000, 
                           paste0("a", 
                           sample(x = 1:10000, 
                                  size = sample(x = 1:10, size = 1))))
matchTable <- paste('a', 1:10000)

system.time(m1 <- lapply(matchFeatures, 
                         function(features) fmatch(features, matchTable)))
system.time(m2 <- lapply(matchFeatures, 
                         function(features) force(fmatch(features, matchTable))))
system.time(m3 <- lapply(matchFeatures, 
                         function(features) fmatch(features, matchTable)))
identical(m1, m3)